용접에서 외부 (제 3 자) 콩의 해상도
-
20-09-2019 - |
문제
몇 달 전에 사양이 출시 되었기 때문에 여전히 인기가 없다는 것을 알고 있습니다.
나는 아직 용접을 "설치"하지 않았고, 그냥 읽고 있습니다.이 질문 으로이 중요한 점을 정확하게 이해하고 싶습니다.
제 3 자 항아리에있는 콩의 해상도는 <alternatives>
당신의 beans.xml
?
그렇지 않은 경우, 가지고 있지 않은 타사 라이브러리의 콩을 사용하는 방법 beans.xml
?
ClassPath에 항아리를 넣는 것이 없으면 작동하지 않습니다. beans.xml
그들의 META-INF
, 당신은 타사 파티 항아리에게는 진실을 만들 수 없습니다. (보다 주제에 대한 개빈 킹의 게시물)
해결책
왜 그렇게 복잡하다고 생각합니까?
그 타사 수업을위한 프로듀서 메모드를 만듭니다.
PDF 파일을 자동으로 가져 와서 팩스마다 보내는 제 3 자 라이브러리가 있다고 가정 해 봅시다.
private @Inject PdfFaxService faxService;
코드에서는 단순히 제작자 방법을 제공 할 수 있습니다. pdffaxservice는 stationeless에서 작동하므로 우리는 그것을 만들 수 있다고 안전하게 가정 할 수 있습니다. @ApplicationScoped
:
public @Produces @ApplicationScoped PdfFaxService createFaxService() {
return new PdfFaxService(initparameters);
}
어딘가에.
HTH.
다른 팁
an에 대한 나의 이해 대안 다른 배포 환경 (예 : 테스트 환경)에서 사용할 수있는 인터페이스의 다른 구현에 대한 대안입니다. an 대안 콩은 주석을 달아 선언합니다 @Alternative
.
주어진 배포 시나리오에서 대안을 사용하려면 <alternatives>
CDI 배포 디스크립터의 요소 META-INF/beans.xml
. 이것은 가능합니다 @Alternative
기본적으로 비활성화되는 콩.
활성화되면 컨테이너가 주어진 주입 지점에 대한 모호한 의존성을 찾으면 주입 할 수있는 대안을 살펴보고 정확히 하나가 있으면이 대안을 선택하십시오.
다시 말해, 대안 교체하는 좋은 방법입니다 기존 구현 배포 시간에 다른 하나와 함께. 교체 할 것이 없다면 대안이 필요하지 않으며 항아리를 클래스 경로에 올려 놓으십시오. 이것이 정확히 당신의 질문인지 확실하지 않지만, 나는 타사 항아리의 개념에 대해 의심합니다.
더 2.1.4. 대안, 4.6. 대안 그리고 4.7. 불만족스럽고 모호한 종속성을 고정합니다 (그러나 나는 이것이 당신이 읽고있는 것 같아요).
업데이트: 추가 질문에 답변합니다.
그렇지 않은 경우 Beans.xml이없는 제 3 자 라이브러리에서 콩을 사용하는 방법
이것은 일어날 수 없습니다. 콩 아카이브에는 bean.xml
섹션에 자세히 설명 된대로 (비어 있음) 15.6. 포장 및 배포 문서 :
CDI는 특별 배포 아카이브를 정의하지 않습니다. 항아리, EJB 자르 또는 전쟁에 콩을 포장 할 수 있습니다. 그러나 아카이브 ~ 해야 하다"콩 아카이브"가 되십시오. 즉, 콩이 포함 된 각 아카이브는
beans.xml
에서META-INF
클래스 경로의 디렉토리 또는WEB-INF
웹 루트의 디렉토리 (전쟁 아카이브 용). 파일이 비어있을 수 있습니다. 아카이브에 배치 된 콩beans.xml
응용 프로그램에서 파일을 사용할 수 없습니다.
그런 다음 불만족스럽고 모호한 의존성을 고치려면 앞에서 언급 한 4.7 절을 참조하십시오.
Update 2: 사용하는 것 같습니다 BeforeBeanDiscovery.addAnnotatedType()
Bean 발견 중에 고려해야 할 다른 클래스를 추가 할 수 있습니다. (BeforeBeanDiscovery
이벤트입니다)