Как использовать CDI для внедрения конструктора с ресурсом JNDI?

Я пытаюсь понять, как использовать внедрение конструктора в CDI, где одним из параметров является поиск JNDI.

С обычной инъекцией поля я могу сделать следующее:

@Stateless
public class Publisher
{

  @Inject
  @JMSConnectionFactory("java:/jms/remoteCF")
  private JMSContext context;

  @Resource(lookup="java:global/remote")
  private InitialContext externalContext;

  private Topic genericTopic;

  @PostConstruct
  public void init(){
       try {  
            Object obj = externalContext.lookup(TOPIC);  
            genericTopic = (javax.jms.Topic) obj;  
       } catch (NamingException namingException) {  

       }  
  }
}  

Однако я хотел бы переключить этот компонент на внедрение конструктора. К сожалению, я не могу понять, как создать конструктор, который внедряет мой ресурс externalContext, учитывая, что это поиск JNDI.

Пример:

 @Inject
  public Publisher( @JMSConnectionFactory("java:/jms/remoteCF") JMSContext context,  @Resource( "java:global/remote") InitialContext externalContext ){
      this.context = context;
      this.externalContext = externalContext;
  }

Но @Resource не является допустимой аннотацией в качестве параметра.

Как я могу указать, что параметр externalContext является bean-компонентом, полученным с помощью поиска JNDI? Где указать имя JNDI?


person Eric B.    schedule 28.09.2017    source источник


Ответы (1)


У вас есть два варианта.

  1. Создайте точку внедрения для своей темы с помощью квалификатора. Что-то вроде:

@Produces @Named(TOPIC) public Topic findTopic(JMSContext context) { return context.createTopic(TOPIC); }

а затем введите это в свой конструктор

  1. Создайте поле/квалификатор производителя для вашего InitialContext.

@Produces @Named("someName") @Resource("java:global/remote") private InitialContext externalContext;

person John Ament    schedule 28.09.2017
comment
Спасибо - мне пришлось перечитать это несколько раз, чтобы понять, как это работает, но я думаю, что понимаю. Однако, насколько я понимаю, поле члена № 2 должно быть статическим полем. - person Eric B.; 11.10.2017
comment
Нет, это не статическое поле. - person John Ament; 12.10.2017