resteasy-cdi 中断部署到 Tomcat 7

Posted

技术标签:

【中文标题】resteasy-cdi 中断部署到 Tomcat 7【英文标题】:resteasy-cdi breaks deployment to Tomcat 7 【发布时间】:2014-02-10 07:30:12 【问题描述】:

我正在使用resteasy 3.0.6.Final 开发一个简单的REST 服务器,部署到tomcat 7.0.50。

根据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 会破坏部署?是否有记录问题的票据? 否则如何将 resteasy 与 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>

成功了,war 文件部署成功。

【问题讨论】:

您的问题的解释可能在“以前的错误”中。在日志中更早地检查它们。如果它们不存在,请检查您的日志记录配置是否没有抑制它们和/或暂时提高日志记录级别。 好的,我终于通过在我的项目中添加和配置weld-servlet 来完成所有工作。似乎 resteasy-cdi 需要一个实际的 CDI 实现才能工作(这是可以理解的,因为它只是作为一个桥梁)。 @***er 您介意发布工作代码的链接吗?我正在使用完全相同的组合(RESTEasy + Weld)并且我注入的 bean 始终为空。我的代码略有不同,它是 Groovy,使用 Gradle 构建并部署到 Jetty,但如果这是我的问题,我们又回到了依赖供应商的黑暗时代。 @AbhijitSarkar,这里是主要配置文件的链接。 gist.github.com/ryan-ju/8907085 @***er 谢谢。以下是我所缺少的并且令人惊讶地不在您的要点中。一旦我添加了它,CDI 就开始了。 resteasy.injector.factoryorg.jboss.resteasy.cdi.CdiInjectorFactory 【参考方案1】:

我在official weld forum 中询问了Singleton is not set 异常,这是文档中的一个错误。正如您所做的那样,您应该使用“原始”org.jboss.weld.environment.servlet.Listener

【讨论】:

【参考方案2】:

Deu certo,obrigado,adicionei

    dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-cdi</artifactId>
        <version>3.0.6.Final</version>
    </dependency>

【讨论】:

以上是关于resteasy-cdi 中断部署到 Tomcat 7的主要内容,如果未能解决你的问题,请参考以下文章

tomcat集群机制剖析及其生产部署选型

tomcat集群机制剖析及其生产部署选型

使用tomcat7-maven-plugin进行Tomcat部署失败,并显示错误“无法调用Tomcat管理器:通过对等方重置连接:套接字写入错误”

SpringBoot项目部署到tomcat

yarn 怎么部署到tomcat

java项目怎样部署到tomcat中