首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为合格的范围内的CDI创建泛型生产者?

如何为合格的范围内的CDI创建泛型生产者?
EN

Stack Overflow用户
提问于 2016-05-25 17:35:06
回答 1查看 601关注 0票数 0

我想做的事情如下:

代码语言:javascript
复制
@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;

当然这不起作用,因为

  1. @Any不作为任何合格@ForQueueName的替代品。
  2. 在生产InjectionPoint bean时不能使用@ApplicationScoped

我知道我可以通过这种方式使用非绑定限定符创建@Dependent作用域bean。但在我的例子中,我实际上需要一个非依赖的作用域bean。

有可能达到预期目标吗?如果没有,有什么特别的原因吗?

干杯,蒂尔曼

编辑:从@Default@Dependent的固定范围名称

EN

回答 1

Stack Overflow用户

发布于 2016-05-26 02:15:05

首先,您应该考虑在应用程序中使用JMSContext。这是一个JMS2.0特性,它的API要干净得多。

其次,应该用ForQueueName对producer方法进行注释。为此,需要将ForQueueNameForQueueName属性标记为@Nonbinding。这告诉CDI容器,在查找生产者时不应该考虑这个值。

代码语言:javascript
复制
@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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37444091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档