2017-01-04 65 views
1

我想通過CDI擴展以編程方式在運行時在EJB中添加攔截器。如何以編程方式添加EJB攔截器?

該EJB公開遠程調用的遠程接口。但是我想在實現類此EJB在這個其他SO問題添加@Interceptors annontation喜歡的添加這個攔截器(CDI Extensions - Add Interceptors in ProcessAnnotatedType phase

我想以後的EJB已經註冊,因爲攔截器是CDI擴展只執行從未打過電話

但是,爲了測試目的,我已經在一個簡單的CDI Bean中以編程方式成功註冊並執行了一個Interceptor。

問題是當我嘗試在EJB中註冊時。

我錯過了什麼嗎?

編輯: 我使用Wildfly 8

回答

2

我認爲這裏的關鍵問題是和@Interceptor(CDI的)@Interceptors(EJB的)之間的差異。 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,因此您可以將CDI攔截器附加到它,而無需更改bean本身。