У меня есть файл .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
Является ли UserInfoResource объявленным @RequestScoped? –
Здравствуйте; нет; Я не добавил никаких аннотаций CDI к 'UserInfoResource'. –
Я сделал предложенное изменение; не было никакой разницы в результатах. –