Как внедрить локальный компонент сеанса без состояния в ресурс JAX-RS с помощью CDI?
У меня есть файл .ear
со стандартным каталогом lib
.
У меня есть файл .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 bean архив, так как он не содержит бобов.
Это соглашение, соответствующее спецификациям, не выполняется во время развертывания. Weld (реализация CDI в GlassFish 3.1.2) утверждает, что точка впрыска, описанная выше, не может быть удовлетворена, поскольку для нее не существует известных реализаций UserInfoManager
.
Когда эта точка впрыска помечается вместо этого @EJB
, все работает нормально.
Как я могу получить CDI для введения местного гражданства ссылка на Боб сеанса в ресурс JAX-RS, который присутствует на пути к классу?
Обновление: потому что независимо от того, как я смотрю на это, это кажется нарушением спецификации, я подал ошибку с прикрепленным тестовым кейсом. Я призываю читателей взглянуть и посмотреть, смогут ли они заставить его работать.
Обновление: обходной путь состоит в том, чтобы убедиться, что ваши классы JAX-RS являются не бобовыми архивами, но являются аннотированными @ManagedBean
. В кроме того, {{.файл war}}, который служит их точкой монтирования, должен быть bean-архивом (должен иметь {{WEB-INF/beans.XML-файл). Некоторая комбинация этих требований является нарушением спецификации CDI. Следующие ошибки отслеживают эти проблемы: http://java.net/jira/browse/GLASSFISH-18793
1 ответ:
Jersey не рассматривает ресурсы как управляемые бобы, если к ним не присоединена явная аннотация scope/@ManagedBean. Таким образом, вам нужно аннотировать свой ресурс с помощью @ManagedBean или @RequestScoped, чтобы инъекция работала.
Похоже, что проблема возникает только в случае бобов.xml включен в файл jar ресурса. Когда я удаляю его и прикрепляю аннотацию @ManagedBean к классу ресурсов (вместо @RequestScoped, так как @RequestScoped не работает, если нет бобов.xml присутствует) это работает. Я не эксперт по CDI, поэтому не уверен, что это так, как задумано, или ошибка.