инъекция ресурсов в cdi bean

Я не уверен, что это должно работать, но я пытаюсь написать продюсера JMS с cdi с wildfly и застрял при введении ресурсов в управляемый cdi bean-компонент:

public class CdiProducer {
    @Resource(name = "java:jboss/DefaultJMSConnectionFactory")
    @Produces
    QueueConnectionFactory qcf;

    @Resource(name = "java:/queue/HELLOWORLDMDBQueue")
    @Produces
    @Hello
    Queue helloWordQueue;

Выполняя это, я получаю следующую ошибку:

JBAS016076: Ошибка внедрения ресурса в управляемый компонент CDI. Не удается найти ресурс с именем ...

Но что очень странно, когда я копирую и вставляю ресурсы в корпоративный компонент, все работает!

@Stateless
public class QueueSender {
    @Resource(name="java:jboss/DefaultJMSConnectionFactory")
    QueueConnectionFactory qcf;

    @Resource(name="java:/queue/HELLOWORLDMDBQueue")
    Queue helloWordQueue;

Очередь определяется как:

  <jms-destinations>
     <jms-queue name="HelloWorldQueue">
        <entry name="/queue/HELLOWORLDMDBQueue"/>
        <entry name="java:jboss/exported/queue/HELLOWORLDMDBQueue"/>
     </jms-queue>
  </jms-destinations>

Это должно так работать? Или это ошибка wildfly?


person mglauche    schedule 17.03.2014    source источник
comment
Разве вы не должны использовать @Resource (mappedName = ...)?   -  person Rudi Angela    schedule 18.03.2014
comment
@ Руди Почему? Ресурс должен уметь работать с локальным именем jndi?   -  person mglauche    schedule 18.03.2014
comment
В вашем вопросе вы пишете JBAS016076: Ошибка внедрения ресурса в управляемый компонент CDI. Не удается найти ресурс с именем ... однако, похоже, вы отключили критическую часть. Можете ли вы включить эту важную часть? Это не работает на Queue или ConnectionFactory? Кроме того, если вы используете WildFly 8, вы можете просто ввести JMSContext и избежать многих из этих значений по умолчанию.   -  person John Ament    schedule 19.03.2014
comment
@John: Оба не работают, с одним и тем же сообщением об ошибке, похоже, совместимы со всеми видами ресурсов. Что касается JMSContext, я бы хотел использовать, но мы используем wildfly для локальной разработки, конечный продукт должен быть развернут в websphere 8.5, то есть только JEE6 / JMS 1.1, поэтому JMSContext нет :(   -  person mglauche    schedule 19.03.2014


Ответы (2)


У меня нет прямого опыта работы с Wildfly / JBoss, но у меня был тот же опыт, что и у вас, с Glassfish. В нашем случае мы использовали @PersistenceContext для введения EntityManager, но я считаю, что применяются те же правила.

В документации по Weld есть раздел об унификации Java. Ресурсы EE и CDI. Он показывает, как вы можете определить поле производителя (более подробно описано здесь), чтобы подключить такой ресурс к CDI таким образом, чтобы вы могли использовать @Inject в другом месте.

Поля имеют двойственность в том, что они могут быть как целью внедрения среды компонентов Java EE, так и объявлены как поле производителя CDI. Следовательно, они могут определить отображение строкового имени в среде компонентов на комбинацию типа и квалификаторов, используемых в мире типизированного внедрения. Мы называем поле производителя, которое представляет ссылку на объект в среде компонента Java EE, ресурсом.

...

Объявление ресурса действительно содержит две части информации: имя JNDI, ссылку EJB, имя единицы сохранения состояния или другие метаданные, необходимые для получения ссылки на ресурс из среды компонента, а также тип и квалификаторы, которые мы будем использовать для внедрения ссылки. в нашу фасоль.

Пример:

@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource") 
@CustomerDatabase Datasource customerDatabase;

В другом месте:

@Inject @CustomerDatabase Datasource customerDatabase;

Хотя это явно не указано на этой странице, я считаю, что класс, содержащий это поле, должен быть bean-компонентом Java EE, то есть иметь аннотацию с одной из аннотаций EJB, например @javax.ejb.Stateless или @javax.ejb.Singleton.

person andersschuller    schedule 17.03.2014

Поздно на вечеринку, но я столкнулся с той же проблемой. При использовании @resource в управляемом компоненте CDI к JNDI всегда добавлялось java: comp / env /. Чтобы исправить это, я изменил name на lookup при использовании @resource вне корпоративного компонента.

@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
person Jimeh    schedule 14.10.2015