2014-01-22 60 views
3

所以,我有一個tomcat 8+球衣2.5.1 +焊接CDI應用程序,在大多數情況下工作得很好。它失敗的地方是我無法用CDI攔截器攔截球衣資源方法調用。這是有道理的,因爲澤西資源類不是CDI bean。那麼,有什麼方法可以讓CDI攔截器在澤西島上工作嗎?提出這個問題的另一種方法是:CDI bean可以用作Jersey資源嗎?注入球衣RS服務(資源)不起作用的CDI攔截器?

謝謝!

編輯: 在我使用Jersey編寫我的RESTful資源之前,我有用於開始和提交數據庫事務的CDI攔截器。我真的需要遵循相同或相似的模式來在我的RESTful球衣資源中實現這種交叉事務注入。這是提出這個問題的主要原因。

再次感謝!

+0

YOu應該能夠在EE容器中使用CDI bean作爲Jersey資源。在Tomcat(servlet容器)中,由於它不是內置的,所以它有點困難。根據這個錯誤,它應該可以工作:https://java.net/jira/browse/JERSEY-883 –

+0

謝謝。該錯誤確實表明CDI攔截器應該起作用。 – doles

+0

我在我的應用程序中擺脫了運動衫,並用直接的servlet替換了它。現在,事情就像他們應該做的那樣工作,我不必處理ResourceConfig crud。此外,我不必處理https://java.net/jira/browse/HK2-181,並可以在我的java8代碼中使用lambda表達式。感謝所有參加這個問題的人! – doles

回答

0

Adam Bien在presentation中建議您將Service(CDI或EJB)類與RESTful資源類分開。他的理由是RESTful類通常使用Jersey注入的HttpHeaders,但在CDI或EJB容器中不可用。危險在於,如果像JSF框架這樣的任何CDI客戶端使用它,您的RESTful類可以注入一個HttpHeaders的空引用。

感謝您的自我回答問題。您剛剛展示了第二個用例,驗證了Adam Bien的建議。

簡單地讓它們分開!

+0

我不確定這是如何回答這個問題的。例如,我今天使用的一個用途是某些REST API上的CDI攔截器,它在激活REST資源之前檢查活動用戶登錄。 –

+0

是的,即使我不確定這是如何回答這個問題。 – doles

2

CDI bean可以用作Jersey資源嗎?

是的,但是由於澤西島的DI基於hk2而不是CDI,因此您需要一座橋。

GlassFish中這樣的橋是由模塊jersey-gf-cdi實現:

<dependency> 
    <groupId>org.glassfish.jersey.containers.glassfish</groupId> 
    <artifactId>jersey-gf-cdi</artifactId> 
    <version>2.6</version> 
</dependency> 

模塊本身會自動註冊並工作於Tomcat的漂亮(假設你已經正確地自舉兩個州和焊接)。

不幸的是,2.6之前的版本只依賴於JNDI,在Tomcat不允許的'java:comp/BeanManager'下搜索提供程序。

針對此行爲的修復程序可用於2.6(我之前提出的拉取請求),並回落到CDI.current().getBeanManager()

我在Tomcat 7上測試了它,並且工作正常,也應該在Tomcat 8上工作。

+0

謝謝。我放棄了Tomcat中的tomcat和cdi,現在我使用JBoss,並且一切都按照它應有的方式運行,開箱即用。 – doles

+0

我無法修復此問題。當我將版本更改爲2.6時,此錯誤發生:WELD-001409:類型「X」的模糊依賴關係。你是如何解決這個問題的? –