【问题标题】:Using JAX-RS (RESTEasy) with CDI (Weld) in Tomcat 7在 Tomcat 7 中使用 JAX-RS (RESTEasy) 和 CDI (Weld)
【发布时间】:2011-06-14 15:21:19
【问题描述】:

在一个 JSF 2.0 应用程序中(在 Tomcat 7 上运行并使用 Weld 1.1.1.Final),我想建议我的用户下载一些二进制文件(.doc、.pdf 等)。

为了满足这个需求,我想使用一个 JAX-RS (RESTEasy 2.2.0.Final) 资源 bean(用 @Path 注释)。问题是在那个 bean 中,我想从一个用@Inject 注释注释的字段调用服务。

实际上,就像 a weld user trying a similar thing 我有一个 NullPointerException :Weld 不会为我注入服务。

所以我读了a post on JBoss community wiki talking about how to integrate RESTEasy with CDI,所以我让我的 maven 战争项目依赖于org.jboss.resteasy:resteasy-cdi,这是我的web.xml

<!-- Weld -->
<resource-env-ref>
    <description>Object factory for the CDI Bean Manager</description>
    <resource-env-ref-name>BeanManager</resource-env-ref-name>
    <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
<listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<filter>
    <filter-name>ConversationPropagationFilter</filter-name>
    <filter-class>org.jboss.weld.servlet.ConversationPropagationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>ConversationPropagationFilter</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

<!-- Resteasy -->
<listener>
    <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<context-param>
    <param-name>resteasy.injector.factory</param-name>
    <param-value>org.jboss.resteasy.cdi.CdiInjectorFactory</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>
<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
</context-param>

现在的问题是,当我的应用程序启动时,我遇到了那个异常:

java.lang.RuntimeException: Unable to instantiate InjectorFactory implementation.
    at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:141)
    at org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap.contextInitialized(ResteasyBootstrap.java:28)
...
Caused by: java.lang.NullPointerException
    at org.jboss.resteasy.cdi.CdiInjectorFactory.lookupBeanManager(CdiInjectorFactory.java:116)
    at org.jboss.resteasy.cdi.CdiInjectorFactory.<init>(CdiInjectorFactory.java:41)
...
    at java.lang.Class.newInstance(Class.java:308)
    at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:133)

当我删除 resteasy.injector.factory 上下文参数时,当我试图从使用 @Inject 注释的字段变量中获取我的服务时,我得到了一个 NPE ...

有谁知道如何配置 RESTEasy bean 以由 Weld 管理(并使 JAX-RS 资源注入成为可能)?

【问题讨论】:

    标签: jax-rs resteasy cdi tomcat7 jboss-weld


    【解决方案1】:

    这已在 RESTEasy 主干中修复。详情请见https://issues.jboss.org/browse/RESTEASY-558

    【讨论】:

    • 非常感谢!你知道如何用 Maven 测试它吗?
    • 等待应该在 2011-06-23 发布的 RESTEasy 2.1.1
    【解决方案2】:

    如果您有机会并且付出的努力是合理的:尝试使用 JBoss AS 6 的相同方案。如果可行,您可能会解决配置问题。如果它因类似(或相等)的异常而失败,您知道这是 Weld 的责任;-)

    这两种结果至少应该为您指明下一步的方向......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 2018-12-08
      • 2016-09-11
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 2016-09-16
      相关资源
      最近更新 更多