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

How to use constructor injection CDI with a JNDI resource?

我正在尝试弄清楚如何在其中一个参数是 JNDI 查找的 CDI 中使用构造函数注入。

使用正常的字段注入,我可以执行以下操作:

@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. 使用限定符为您的主题创建注入点。类似于:

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

然后将其注入您的构造函数

  1. 为您的 InitialContext 创建制作人 field/qualifier。

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