我正在開發一個簡單的REST服務器,使用resteasy 3.0.6.Final,它被部署到tomcat 7.0.50。resteasy-cdi休息部署到Tomcat 7
按照official doc,基本上有兩種方法可以做到這一點:
使用ServletContainerInitializer,這是在包
resteasy-servlet-initializer
實現。使用
web.xml
和servlet調度程序。
我試過這些方法,他們都爲我工作。
現在我想用WELD添加CDI的支持,要做到這一點,我需要
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-cdi</artifactId>
<version>3.0.6.Final</version>
</dependency>
添加依賴我的戰爭/ WEB-INF/lib目錄下。
但是,這會中斷部署。 Tomcat在catalina.out中只顯示以下錯誤消息:
Jan 20, 2014 10:24:06 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error filterStart
Jan 20, 2014 10:24:06 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/storage] startup failed due to previous errors
網上有很多關於刪除resteasy-cdi的建議。所以
- 爲什麼resteasy-cdi會破壞部署?有沒有記錄問題的票據?
- 我該如何將WELD與WELD整合?
感謝您的幫助。
更新1
調試會話後,這個問題原來是非常簡單的:RestEasy的-CDI需要一個具體的CDI落實工作,這意味着我應該包括
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
</dependency>
在我的身材。
另一個注意事項是配置official doc中提到的WELD。當我包括我的web.xml這兩個聽衆,
<listener>
<listener-class>org.jboss.weld.servlet.WeldInitialListener</listener-class>
</listener>
<listener>
<listener-class>org.jboss.weld.servlet.WeldTerminalListener</listener-class>
</listener>
我得到了下面的錯誤在我localhost.log
Jan 20, 2014 11:55:40 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.jboss.weld.servlet.WeldInitialListener
java.lang.IllegalStateException: Singleton is not set. Is your Thread.currentThread().getContextClassLoader() set correctly?
我不知道,如果文檔是錯誤的,但用監聽器與
<listener>
<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
訣竅和戰爭文件部署成功。
您的問題的解釋可能會在「以前的錯誤」。在日誌中檢查它們。如果它們不在那裏,請檢查您的日誌配置是否禁止它們和/或暫時增加日誌記錄級別。 –
好吧,我終於通過添加和配置weld-servlet到我的項目中來完成所有工作。似乎resteasy-cdi需要一個實際的CDI實現才能工作(這是可以理解的,因爲它只是一個橋樑)。 – stackoverflower
@stackoverflower你介意發佈一個鏈接到工作代碼嗎?我使用完全相同的組合(RESTEasy + Weld),我的注入bean始終爲空。我的代碼與使用Gradle構建並部署到Jetty的Groovy略有不同,但如果這是我的問題,我們又回到了供應商依賴的黑暗時代。 –