【问题标题】:How do I force usage of a CDI producer method?如何强制使用 CDI 生产者方法?
【发布时间】:2012-06-10 17:17:05
【问题描述】:

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

假设我有一个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 ....

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

【问题讨论】:

    标签: cdi jsr299


    【解决方案1】:

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

    为此缝焊has a solution

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

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

    【讨论】:

    • 所以基本上:除了在 CDI 1.0 中使用 @Typed 注释之外,不能强制它?
    • 我不确定我是否理解您的评论。您可以使用 Solder 的 @Unwraps 独立强制生产。而且CDI中没有@Typed这样的东西......!?
    • @Typed: docs.oracle.com/javaee/6/api/javax/enterprise/inject/Typed.html 简而言之,你限制了你的 bean 暴露给 CDI 内部的 bean 类型。这将是一种告诉 CDI 机器远离您的对象并允许您的生产者方法直接实例化它的方法。我的用例是创建一个Logger 实例(没有无参数构造函数!),以便我可以控制它在记录时创建的LogRecord 类型。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      @Inject
      private Object something;
      

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

      【讨论】:

        猜你喜欢
        • 2017-09-25
        • 2015-10-01
        • 2011-11-20
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 2015-04-08
        • 1970-01-01
        相关资源
        最近更新 更多