【问题标题】:How to specify an @Alternative producer method in beans.xml?如何在 beans.xml 中指定 @Alternative producer 方法?
【发布时间】:2014-02-03 08:17:10
【问题描述】:

说我有:

public interface Foo {...}

public class AltProducer {
  private Foo altFoo;

  @Produces @Alternative
  public Foo getAltFoo() { return altFoo; }
}

我需要在 beans.xml 中添加什么,以便调用 AltProducer 的 @Produces 方法,而不是注入 Bar?

【问题讨论】:

    标签: java jakarta-ee dependency-injection cdi weld


    【解决方案1】:

    找到了 - 您可以指定整个生产者类作为替代。

    @Alternative
    public class AltProducer { ... }
    

    beans.xml:

    <beans>
      <alternatives>
        <class>com.package.AltProducer</class>
      </alternatives>
    </beans>
    

    【讨论】:

    • +1。我觉得非常麻烦。 @Alternative 的 Javadocs 说:May be applied to a bean class, producer method or field 。但这会产生误导,因为在 beans.xml 中我们只能指定 &lt;class&gt;&lt;stereotype&gt; - 无法输入生产者方法或字段。
    • 你完全正确。在生产者方法中使用 @Alternative 注释绝对没有意义,因为它无法在 beans.xml 中启用生产的 Alternative。
    • CDI 1.1 的另一点是,在大多数情况下,当您将父类注释为替代项时,您还需要添加优先级注释以在 WELD 的所有 BeanDeploymenyArchieves 中启用该替代项。所以请记住,在 jEE 7 中您很少使用无优先级的替代方案。
    【解决方案2】:

    你必须在 src/main/resources/META-INF 中创建一个 beans.xml 文件,然后

    <beans xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    <beans>
      <alternatives>
        <class>com.package.AltProducer</class>
      </alternatives>
    </beans>
    </beans>
    

    别忘了用@alternative 注释你的类 你可以查看这篇关于cdi的文章https://www.baeldung.com/java-ee-cdi

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2012-02-02
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2012-12-20
      相关资源
      最近更新 更多