jax-rs之在 Tomcat 7 中使用 JAX-RS (RESTEasy) 和 CDI (Weld)

虾米姐 阅读:97 2025-05-04 20:05:19 评论:0

在 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 war 项目依赖于 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上下文参数,我有一个 NPE当试图从带有 @Inject 注释的字段变量中获取我的服务时...

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

请您参考如下方法:

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


标签:Tomcat
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号