2014-01-20 141 views
2

我正在開發一個簡單的REST服務器,使用resteasy 3.0.6.Final,它被部署到tomcat 7.0.50。resteasy-cdi休息部署到Tomcat 7

按照official doc,基本上有兩種方法可以做到這一點:

  1. 使用ServletContainerInitializer,這是在包resteasy-servlet-initializer實現。

  2. 使用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的建議。所以

  1. 爲什麼resteasy-cdi會破壞部署?有沒有記錄問題的票據?
  2. 我該如何將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> 

訣竅和戰爭文件部署成功。

+0

您的問題的解釋可能會在「以前的錯誤」。在日誌中檢查它們。如果它們不在那裏,請檢查您的日誌配置是否禁止它們和/或暫時增加日誌記錄級別。 –

+0

好吧,我終於通過添加和配置weld-servlet到我的項目中來完成所有工作。似乎resteasy-cdi需要一個實際的CDI實現才能工作(這是可以理解的,因爲它只是一個橋樑)。 – stackoverflower

+0

@stackoverflower你介意發佈一個鏈接到工作代碼嗎?我使用完全相同的組合(RESTEasy + Weld),我的注入bean始終爲空。我的代碼與使用Gradle構建並部署到Jetty的Groovy略有不同,但如果這是我的問題,我們又回到了供應商依賴的黑暗時代。 –

回答

1

我問了official weld forum中的Singleton is not set異常,這是文檔中的一個錯誤。正如你所做的那樣,你應該使用'原始'org.jboss.weld.environment.servlet.Listener