5

我在这里的部分问题是使用正确的词汇,所以我提前为这可能是一个简单的术语问题道歉。

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

进一步假设我在某处(带注释@Produces)有一个生产者方法,它返回一个Person. 在内部它返回一个 new PersonBean,但这既不在这里也不在那里。

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

@Inject
private Person person;

假设我有我的所有beans.xml文件等,并且已经引导了 Weld 或另一个符合 CDI-1.0 的环境,因为这一切都代表我将得到一个模棱两可的定义错误。这是有道理的:Weld 会发现 myPersonBean作为注入候选者(它可以只调用构造函数)并且会发现我的 producer 方法的输出作为注入候选者。

我想做的是以某种方式强制Person此应用程序中实例的生成始终通过生产者方法。

我知道我可以在某处发明一些限定符,并使生产者方法产生Person由该限定符限定的实例。如果我这样做,并将我的注入点更改为包含限定符,那么显然这些合格的注射剂只有一个来源(即我的生产者方法),所以,问题解决了。

但是假设我不想发明一些虚假的限定词。(我不是说是这种情况;只是想更深入地理解这些问题。)我有什么选择?我有吗?我想我可以穿上它@Typed(Object.class)PersonBean这样它就不会被 CDI 视为Person...。

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

4

3 回答 3

3

将您的 PersonBean 注释为 @Alternative 然后它将使用生产者方法。

于 2012-06-07T13:15:21.497 回答
2

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

@Inject
private Object something;

...谢天谢地,这几乎不存在。:-)

于 2012-06-08T16:15:01.190 回答
1

我想做的是以某种方式强制此应用程序中 Person 实例的生成始终通过生产者方法。

缝焊对此有一个解决方案

我不能 100% 确定 Seam 3 和Deltaspike的合并将如何发展(页面是如此 90 年代,但内容摇滚:-),但将 Solder 放入类路径肯定是一个安全的选择。

哦,据我所知,CDI 1.1 规范中有一个类似的机制。

于 2012-06-06T18:01:06.017 回答