我想做的事情如下:
@Qualifier
@Retention(RUNTIME)
@Target({ PARAMETER, FIELD, METHOD, TYPE })
public @interface ForQueueName{
String value();
}
public class JmsSenderProducer {
@Produces
@Any
@ApplicationScoped
public JmsSender createJmsSender(InjectionPoint ip) {
ForQueueName annotation = ip.getAnnotated().getAnnotation(ForQueueName.class);
return new JmsSender(annotation.value());
}
}
// Somewhere else
@Inject
@ForQueueName("java:/jms/queue/my.queue.name")
JmsSender myQueueSender;当然这不起作用,因为
@Any不作为任何合格@ForQueueName的替代品。InjectionPoint bean时不能使用@ApplicationScoped。我知道我可以通过这种方式使用非绑定限定符创建@Dependent作用域bean。但在我的例子中,我实际上需要一个非依赖的作用域bean。
有可能达到预期目标吗?如果没有,有什么特别的原因吗?
干杯,蒂尔曼
编辑:从@Default到@Dependent的固定范围名称
发布于 2016-05-26 02:15:05
首先,您应该考虑在应用程序中使用JMSContext。这是一个JMS2.0特性,它的API要干净得多。
其次,应该用ForQueueName对producer方法进行注释。为此,需要将ForQueueName的ForQueueName属性标记为@Nonbinding。这告诉CDI容器,在查找生产者时不应该考虑这个值。
@Qualifier
@Retention(RUNTIME)
@Target({ PARAMETER, FIELD, METHOD, TYPE })
public @interface ForQueueName{
@Nonbinding String value();
}
public class JmsSenderProducer {
@Produces
@ForQueueName("")
@Dependent // must be dependent to interrogate the injection point
public JmsSender createJmsSender(InjectionPoint ip) {
ForQueueName annotation = ip.getAnnotated().getAnnotation(ForQueueName.class);
return new JmsSender(annotation.value());
}
}
// Somewhere else
@Inject
@ForQueueName("java:/jms/queue/my.queue.name")
JmsSender myQueueSender;https://stackoverflow.com/questions/37444091
复制相似问题