我正在开发一个简单的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略有不同,但如果这是我的问题,我们又回到了供应商依赖的黑暗时代。 –