我的部分问题是使用适当的词汇,所以我提前道歉可能是一个简单的术语问题。
假设我有一个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
....
欢迎任何想法,包括文档指南或更好的理解方法。感谢。
答案 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规范。