如何将构造函数注入 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 名称?
你有两个选择。
- 使用限定符为您的主题创建注入点。类似于:
@Produces
@Named(TOPIC)
public Topic findTopic(JMSContext context) {
return context.createTopic(TOPIC);
}
然后将其注入您的构造函数
- 为您的
InitialContext
创建制作人 field/qualifier。
@Produces
@Named("someName")
@Resource("java:global/remote")
private InitialContext externalContext;
我正在尝试弄清楚如何在其中一个参数是 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 名称?
你有两个选择。
- 使用限定符为您的主题创建注入点。类似于:
@Produces
@Named(TOPIC)
public Topic findTopic(JMSContext context) {
return context.createTopic(TOPIC);
}
然后将其注入您的构造函数
- 为您的
InitialContext
创建制作人 field/qualifier。
@Produces
@Named("someName")
@Resource("java:global/remote")
private InitialContext externalContext;