Как внедрить локальный компонент сеанса без состояния в ресурс 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 3

1 ответ:

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

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