Использование JAX-RS (RESTEasy) с CDI (сварка) в Tomcat 7 - PullRequest
3 голосов
/ 14 июня 2011

В приложении JSF 2.0 (работающем на Tomcat 7 и использующем weld 1.1.1.Final) я хочу предложить своему пользователю загрузить некоторые двоичные файлы (.doc, .pdf и т. Д.).

Чтобы удовлетворить эту потребность, я хочу использовать компонент ресурса JAX-RS (RESTEasy 2.2.0.Final) (помеченный @Path). Проблема в том, что внутри этого компонента я хочу вызывать службу из поля, помеченного аннотацией @Inject.

На самом деле, как пользователь-сварщик, пробующий аналогичную вещь У меня есть NullPointerException: сварка не вводит мне мой сервис.

Итак, я прочитал пост в вики сообщества JBoss, рассказывающий о том, как интегрировать 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 ...

Кто-нибудь знает, как настроить bean-компоненты RESTEasy для управления Weld (и сделать возможным внедрение в ресурсы JAX-RS)?

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Это было исправлено в RESTEasy транке. Подробнее см. https://issues.jboss.org/browse/RESTEASY-558.

0 голосов
/ 15 июня 2011

Если у вас есть такая возможность и разумные усилия: попробуйте тот же сценарий с JBoss AS 6. Если это сработает, вы, вероятно, добьетесь проблем с конфигурацией. Если произойдет сбой с похожим (или равным) исключением, вы знаете, что виноват Weld; -)

Оба результата должны, по крайней мере, дать вам направление, куда смотреть дальше ...

...