如何使用构造函数注入CDI与JNDI资源?

时间:2017-09-28 14:56:46

标签: java dependency-injection cdi constructor-injection

我正在试图弄清楚如何在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) {  

       }  
  }
}  

但是,我想将此bean切换为构造函数注入。不幸的是,我无法弄清楚如何创建一个注入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参数是通过JNDI查找检索的bean?我在哪里指定JNDI名称?

1 个答案:

答案 0 :(得分:2)

您有两种选择。

  1. 使用限定符为主题创建注入点。类似的东西:
  2. @Produces @Named(TOPIC) public Topic findTopic(JMSContext context) { return context.createTopic(TOPIC); }

    然后将其注入构造函数

    1. 为您的InitialContext创建一个制作人字段/限定符。
    2. @Produces @Named("someName") @Resource("java:global/remote") private InitialContext externalContext;

相关问题