2014-01-22 3 views
3

Итак, у меня есть приложение tomcat 8 + jersey 2.5.1 + сварка CDI, которое работает очень хорошо в большинстве случаев. Там, где это не удается, я не могу перехватить вызовы метода ресурса джерси с помощью перехватчика CDI. Это имеет смысл, потому что класс ресурсов трикотажа не является компонентом CDI. Тогда, есть ли способ сделать работу перехватчика CDI в майке? Другой способ задать этот вопрос: может ли CDI bean использоваться в качестве ресурса Джерси?Перехватчик CDI, введенный в службу RS (ресурс) Джерси, не работает?

Спасибо!

EDIT: Прежде чем я написал мои RESTful ресурсов, используя Джерси, я имел CDI перехватчики, которые были использованы для начала и совершения транзакций базы данных. Мне действительно нужно следовать той же самой или аналогичной схеме для реализации этой сквозной транзакции в моих ресурсах RESTful. Это основная причина для того, чтобы задать этот вопрос.

Еще раз спасибо!

+0

YOu должен иметь возможность использовать CDI bean в качестве ресурса Джерси в контейнере EE. В Tomcat (контейнер сервлетов) это немного сложнее, поскольку он не встроен. По этой ошибке он должен работать: https://java.net/jira/browse/JERSEY-883 –

+0

Спасибо. Эта ошибка говорит о том, что перехватчики CDI должны работать. – doles

+0

Я избавился от трикотажа в своем приложении и заменил его прямыми сервлетами. Теперь все работает так, как должно, и мне не нужно иметь дело с ResourceConfig crud. Кроме того, мне не нужно иметь дело с https://java.net/jira/browse/HK2-181 и использовать лямбда-выражения в моем коде java8. Спасибо всем, кто присутствовал на этом вопросе! – doles

ответ

0

Adam Bien в одном presentation рекомендует отделить класс службы (CDI или EJB) от класса ресурсов RESTful. Его причина заключалась в том, что класс RESTful обычно использует HttpHeaders, введенный Джерси, но недоступный в контейнерах CDI или EJB. Опасность заключается в том, что вашим классам RESTful может быть введена нулевая ссылка HttpHeaders, если любой клиент CDI, такой как структура JSF, использует его.

Спасибо, что ответили на ваш вопрос. Вы только что показали второй вариант использования, который подтверждает рекомендацию Адама Биена.

Просто держите их отдельно!

+0

Я не уверен, как это отвечает на вопрос.Например, сегодня я использую перехватчик CDI для некоторых REST API, которые проверяют активный вход пользователя перед активацией ресурса REST. –

+0

Да, даже я не уверен, как это отвечает на вопрос. – doles

2

Может ли CDI bean использоваться в качестве ресурса Джерси?

Да, но поскольку DI DI DIY основан на hk2, а не CDI, вам нужен мост.

В GlassFish такого моста реализуется модулем jersey-gf-cdi:

<dependency> 
    <groupId>org.glassfish.jersey.containers.glassfish</groupId> 
    <artifactId>jersey-gf-cdi</artifactId> 
    <version>2.6</version> 
</dependency> 

Модуль регистрирует себя автоматически и работает на сервере Tomcat красиво (при условии, что вы правильно бутстрапированными как Джерси и Weld).

К сожалению, версии до 2.6 полагаются только на JNDI, ищите поставщика в разделе «java: comp/BeanManager», который Tomcat не разрешает.

Исправление этого поведения доступно для 2.6 (запрос на растяжение, который я сделал некоторое время назад), и возвращается на CDI.current().getBeanManager().

Я тестировал его на Tomcat 7 и работал правильно, должен работать и с Tomcat 8.

+0

Спасибо. Я отказался от tomcat и cdi в tomcat. Теперь я использую JBoss, и все работает так, как предполагается, из коробки. – doles

+0

Я не могу исправить это. Когда я меняю версию на 2.6, эта ошибка возникает: WELD-001409: Неоднозначные зависимости для типа «X». Как вы это исправили? –

Смежные вопросы