2017-01-04 1 views
1

런타임에 EJB에서 CDI 확장을 통해 프로그래밍 방식으로 인터셉터를 추가하려고합니다.프로그래밍 방식으로 EJB 인터셉터를 추가하는 방법은 무엇입니까?

이 EJB는 원격 호출을 위해 원격 인터페이스를 제공합니다. 하지만이 다른 SO 질문에 같은 @Interceptors annontation를 추가이 EJB의 구현 클래스에이 인터셉터를 추가하기 위해 노력하고있어 (CDI Extensions - Add Interceptors in ProcessAnnotatedType phase)

나는 인터셉터이기 때문에 EJB가 이미 등록이 된 이후 CDI 확장은 실행 생각 결코 부르지 않았다.

그러나 테스트 목적으로 간단한 CDI Bean에서 프로그래밍 방식으로 인터셉터를 성공적으로 등록하고 실행했습니다.

문제는 EJB에 등록하려고 할 때입니다.

내가 누락 된 항목이 있습니까?

편집 : 내가

답변

2

제이보스 8 사용하고 내가 여기서 중요한 문제는 @Interceptors (EJB 것들) 사이의 차이 @Interceptor (CDI 것들)라고 생각합니다. CDI는 EJB 컨테이너를 관리하지 않으므로 CDI 확장에 EJB 주석 (@Interceptors)을 추가해도 EJB 로직이 반드시 실행되지는 않습니다. EJB 컨테이너가 그 시점에 시작되었을 수 있으며 주석을 알 수 없습니다. 더욱이 CDI 확장은이 주석을 AnnotatedType에 추가합니다.이 구조체는 아마도 EJB를 사용하지 않을 것입니다. 반면, CDI/EJB 통합을 담당하는 응용 프로그램 서버는 응용 프로그램 서버에 따라 달라 지므로 AS 간의 동작이 "보너스"로 다를 수 있습니다.

CDI 확장은 CDI 부트 스트랩 수명주기에 연결할 수 있도록 해주므로 CDI 인터셉터를 사용/사용/추가 할 수 있습니다. 나는 대신 그 길로 갈 것입니다. 심지어 SO question you referred to도 활성화를 위해 beans.xml/@Priority을 말합니다. 즉, CDI 인터셉터을 사용하고 EJB는 사용하지 않습니다.

또한 EJB bean은 자동으로 CDI bean이되어야하므로 bean 자체를 변경하지 않고 CDI 인터셉터를 연결할 수 있습니다.

관련 문제