2012-06-10 3 views
3

У меня есть файл .ear со стандартным каталогом lib.Как добавить локальный сеансовый bean-компонент в ресурс JAX-RS с помощью CDI?

У меня есть файл .jar в этом каталоге lib. Он содержит UserInfoManager, который является интерфейсом. Он содержит (для этих целей) никаких других классов. Он также содержит файл META-INF/beans.xml.

У меня есть еще .jar файл в этом lib. Он содержит класс с именем UserInfoResource, который является классом ресурсов JAX-RS. Этот класс имеет следующие в нем:

@Inject 
private UserInfoManager userManager; 

Далее, у меня есть файл EJB .jar в корне файла .ear. Он содержит класс с именем UserManagerBean, который реализует интерфейс UserInfoManager. Этот класс помечается @Stateless и в основном ничего другого (таким образом, не делает его местный сессионный компонент подвергается через собственный бизнес интерфейс (UserInfoManager). Этот .jar файл также имеет META-INF/beans.xml файл.

Далее, у меня есть .war файл класс Application в нем и ничего больше. Это служит «точкой монтирования» для всех ресурсов JAX-RS, обнаруженных во время развертывания, присутствующих в каталоге lib. Я не объявляю этот модуль Java EE 6 как архив бина CDI, поскольку он не содержит фасолей.

Это несоответствующее требованиям устройство не работает во время развертывания. Сварка (реализация CDI в GlassFish 3.1.2) требует что указанная выше точка впрыска не может быть удовлетворена, поскольку нет доступных вариантов реализации UserInfoManager.

В этом случае точка впрыска аннотируется @EJB, все работает нормально.

Как получить CDI, чтобы вставить локальную ссылку на сессионный компонент без состояния в ресурс JAX-RS, который присутствует в пути к классам?

Обновление: Потому что независимо от того, как я смотрю на это, похоже на нарушение спецификации, у меня есть filed a bug with a testcase attached. Я призываю читателей взглянуть и посмотреть, смогут ли они заставить его работать.

Update: Чтобы обойти эту проблему, чтобы убедиться, что ваши классы JAX-RS являются не боб архивы, но являются с аннотацией @ManagedBean. Кроме того, файл {{.war}}, который служит точкой монтирования, должен быть архивом bean (должен иметь файл {{WEB-INF/beans.xml}}). Некоторая комбинация этих требований является нарушением спецификации CDI. Следующая проблема устраняет следующие проблемы: http://java.net/jira/browse/GLASSFISH-18793

+0

Является ли UserInfoResource объявленным @RequestScoped? –

+0

Здравствуйте; нет; Я не добавил никаких аннотаций CDI к 'UserInfoResource'. –

+0

Я сделал предложенное изменение; не было никакой разницы в результатах. –

ответ

3

Джерси не обрабатывает ресурсы как управляемые компоненты, если к ним не добавлена ​​явная аннотация/@ ManagedBean. Таким образом, вам необходимо аннотировать свой ресурс с помощью @ManagedBean или @RequestScoped для работы инъекции.

Кажется, проблема возникает, только если beans.xml включен в файл jar ресурса. Когда я удаляю его и прикрепляю аннотацию @ManagedBean к классу ресурсов (вместо @RequestScoped, так как @RequestScoped не работает, если beans.xml не присутствует), он работает. Я не являюсь экспертом по CDI, поэтому не уверен, что это так спроектировано или ошибка.

+0

Спасибо за внимание. Хотя с вашими изменениями я могу заставить приложение развернуть, любое обращение к реальному ресурсу все равно приводит к «NullPointerException». –

+0

Забыл отметить, что вам нужно добавить beans.xml в папку WEB-INF вашей войны. При этом инъекция также должна работать. –

+0

Спасибо за помощь, Мартин. Я обобщил различные ошибки GlassFish и проблемы интерпретации спецификаций на странице выпуска GlassFish: http://java.net/jira/browse/GLASSFISH-18793?focusedCommentId=341270&page=com.atlassian.jira.plugin.system.issuetabpanels% 3Acomment-tabpanel # action_341270 –