2013-09-02 8 views
2

Glassfish 3.1.2.2, java ee6을 사용하고 있습니다.java ee6 : 대체 CDI 대체

클래스에서 CDI를 사용하여 도우미 클래스를 얻는 라이브러리가 있습니다. 하나의 특정 프로젝트에서 라이브러리를 사용하고, CDI 의존성을 재정의하고 라이브러리가 내 프로젝트의 고유 한 도우미 클래스를 사용하도록하고 싶습니다. 라이브러리는 자유롭게 수정할 수 있지만 기본적으로 기본 도우미 클래스를 사용해야하므로 라이브러리의 다른 사용자도 동작이 변경되지 않습니다.

이것은 CDI 패턴 @Alternative의 완벽한 응용 프로그램이어야합니다. 헬퍼 클래스 API를위한 Java 인터페이스를 만들었습니다. 라이브러리에 기본 구현이있는 경우 beans.xml<alternatives> 태그를 사용할 수 있습니다. 프로젝트에서 내가 동작을 오버라이드하고 싶다면, 그 특정 프로젝트의 beans.xml에 헬퍼의 구현을 명시 할 것이다.

예외 : 작동하지 않는 경우. CDI 1.0 (java ee6)의 라이브러리 외부에서 라이브러리의 대체 동작을 무시하려면 apparentlyimpossible입니다.

그래서 내 외부 프로젝트의 beans.xml에서 지정하는 것과 관계없이 CDI는 라이브러리에 정의 된 빈을 계속 선택합니다.

필자는 going through a producer으로 생각했지만 제작자에게 매개 변수로 EntityManager를 제공하는 방법을 찾지 못해서 도우미 클래스로 전달할 수 있습니다. 이 프로젝트에서는 일반적으로 @PersistenceContext 주석을 사용하여 EntityManager를 삽입합니다.

외부 프로젝트에서 CDI 삽입을 무시하는 방법에 대한 아이디어가 있습니까?

답변

0

필자가 사용한 솔루션은 LightGuard의 제안과 관련이 있습니다. CDI 확장이 있으며 processAnnotatedType()을 무시합니다.

그러나 대신 교체 AnnotatedType (나는 내가 할 수있는 방법을 잘 모르겠어요있는), 내가 거기에 설명 된 기술을 사용 http://docs.jboss.org/weld/reference/latest/en-US/html/extend.html#d0e4800

을 그리고 라이브러리에 정의 된 빈 거부권을 행사할.

기본 구현이 거부되었습니다. 응용 프로그램에 내 자신의 bean을 넣으면 CDI가 선택한 것입니다.

이 Arquillian 통합 테스트에서이 작업을하려면, 당신은 당신의 아카이브에이 호출을 추가해야합니다

addAsServiceProvider(Extension.class, <CDI extension class name>.class) 

javax.enterprise.inject.spi.Extension 자원 (SHRINKWRAP-266 참조) Arquillian에 영향을주지 할 필요가 없습니다.

1

이렇게하려면 휴대용 확장 프로그램을 작성하십시오. ProcessAnnotatedType 이벤트를 듣고 AnnotatedType을 자신의 것으로 바꿉니다. Apache DeltaSpike BeanBuilder 클래스를 사용하여이 작업을 수행 할 수 있습니다.

+0

'@ Priority'주석은 어떻게됩니까?이 경우에는 작동하지 않습니까, 아니면 JEE 7입니까? – albogdano

+0

응? CDI 1.0 또는 1.1에 '@ Priority'주석이 없습니다. – LightGuard

+1

JEE 7에서 [docs] (http://docs.oracle.com/javaee/7/tutorial/doc/cdi-adv002.htm)를 읽었습니다. . 그러면 @Alternative @Priority (Interceptor.Priority.APPLICATION + 10) 공용 클래스 X'를 작성하고 주석 만 사용하여 기본 bean을 대체 할 수 있습니다. – albogdano

1

Apache DeltaSpike는 바보 같은 BDA 규칙을 우회하는 global-alternatives라는 기능을 제공합니다. 많은 컨테이너로 테스트 했으므로 직접 세부 사항을 신경 쓰지 않아도됩니다. OpenWebBeans를 사용하면이 문제가 전혀 발생하지 않으며 일부 버전의 Weld는 META-INF 대신 WEB-INF의 beans.xml을 통해이를 지원합니다.