jax-rs-在Tomcat7中使用jax-rs(RESTEasy)和CDI(Weld)



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

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

事实上,就像一个焊接用户尝试类似的事情一样,我有一个NullPointerException:weld并没有为我注入服务。

所以我在JBoss社区wiki上读到一篇关于如何将RESTEasy与CDI集成的文章,所以我让我的专业战争项目依赖于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资源中实现注入)吗?

此问题已在RESTEasy中继中修复。看见https://issues.jboss.org/browse/RESTEASY-558详细信息。

如果你有机会并且付出的努力是合理的:用JBoss AS 6尝试同样的场景。如果这样做有效,您可能会确定一个配置问题。如果它以类似(或同等)的例外情况失败,你知道这是Weld的错;-)

这两个结果至少都应该给你一个下一步的方向。。。

最新更新