在 JSF 2.0 应用程序(在 Tomcat 7 上运行并使用weld 1.1.1.Final)中,我想建议我的用户下载一些二进制文件(.doc、.pdf 等)。
为了满足这个需求,我想使用一个 JAX-RS (RESTEasy 2.2.0.Final) 资源 bean(用 注释@Path
)。问题是在那个 bean 里面,我想从一个带有@Inject
注解的字段中调用一个服务。
实际上,就像一个焊接用户尝试类似的事情一样,我有一个NullPointerException
:Weld 不会向我注入我的服务。
因此,我在 JBoss 社区 wiki 上阅读了一篇关于如何将 RESTEasy 与 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
上下文参数时,我有一个NPE
当我试图从带有注释的字段变量中获取我的服务时@Inject
......
有谁知道如何将 RESTEasy bean 配置为由 Weld 管理(并可以在 JAX-RS 资源中注入)?