代码之家  ›  专栏  ›  技术社区  ›  Eric B.

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

  •  1
  • Eric B.  · 技术社区  · 7 年前

    我试图找出如何在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

    例子:

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

    但是 @Resource 不是允许作为参数的注释。

    外部上下文 参数是通过JNDI查找检索的bean吗?在哪里指定JNDI名称?

    1 回复  |  直到 7 年前
        1
  •  2
  •   John Ament    7 年前

    你有两个选择。

    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;