如何强制使用CDI生产者方法?

时间:2012-06-06 16:43:08

标签: cdi jsr299

我的部分问题是使用适当的词汇,所以我提前道歉可能是一个简单的术语问题。

假设我有一个Person接口,以及一个实现该接口的PersonBean类。

假设我在某处(注释@Produces)有一个返回Person的生成器方法。在内部它返回一个新的PersonBean,但这既不在这里也不在那里。

最后,假设我有另一个CDI bean,其注入点定义如下:

@Inject
private Person person;

假设我已经拥有了所有beans.xml个文件,并且已经引导了Weld或其他符合CDI-1.0标准的环境,因为这一切都有了,我会得到一个模棱两可的定义错误。这是有道理的:Weld将找到我的PersonBean作为注射候选者(它可以只调用构造函数)并且会找到我的生成器方法的输出作为注射候选者。

我想要做的是以某种方式强制在此应用程序中生成Person个实例以始终路由生成器方法。

我理解我可以在某处创建一些限定符,并使生成器方法生成由该限定符限定的Person个实例。如果我这样做,并改变我的注射点以包括限定符,那么显然这些合格的注射剂只有一个来源(即我的生产者方法),所以,问题解决了。

但是假设我不想发明一些虚假的限定词。 (我不是说这是事实;只是想更深入地了解这些问题。)我有什么选择?我有吗?我想我可以将@Typed(Object.class)放在PersonBean上,以便它不会被CDI视为Person ....

欢迎任何想法,包括文档指南或更好的理解方法。感谢。

3 个答案:

答案 0 :(得分:3)

将PersonBean注释为@Alternative,然后它将使用producer方法。

答案 1 :(得分:2)

通过在这里和其他地方消化几个不同的答案,我采用的解决方案是在我的bean上使用值为@Typed的{​​{1}}注释。这意味着它只能被注入到声明如下的字段:

Object.class

...幸运的是,证明几乎不存在。 : - )

答案 2 :(得分:1)

  

我想做的是以某种方式强迫Person的制作   此应用程序中的实例始终路由生产者   方法

为此焊缝has a solution

我不能100%确定这将如何与Seam 3和Deltaspike合并(页面是90年代,但内容摇滚:-),但将Solder放入类路径肯定是安全的赌注。

哦,据我所知,类似的机制已经进入了CDI 1.1规范。