【问题标题】:How can I make Weld to distinguish [@Default@Any@Named] from [@Default@Any]?如何让 Weld 区分 [@Default@Any@Named] 和 [@Default@Any]?
【发布时间】:2015-11-29 01:31:00
【问题描述】:

我正在使用 weld-se 测试我的 JSR-330 注释类之一。

@Inject HelloWorld any;
@Inject @Named("impl") HelloWorld namedAsImpl;
@Inject @Named("demo") HelloWorld namedAsDemo;
@Inject @Impl HelloWorld qualifiedWithImpl;
@Inject @Demo HelloWorld qualifiedWithDemo;

我成功地为这些字段注入了 Guice、Dagger 和 Dagger2。

我准备了一个提供者类。

@RequestScoped
public class HelloWorldWeldProvider {

    @Produces HelloWorld any() {
        return current().nextBoolean()
               ? new HelloWorldImpl() : new HelloWorldDemo();
    }

    @Produces @Named("impl") HelloWorld namedAsImpl() {
        return new HelloWorldImpl();
    }

    @Produces @Named("demo") HelloWorld namedAsDemo() {
        return new HelloWorldDemo();
    }

    @Produces @Impl HelloWorld qualifiedWithImpl() {
        return new HelloWorldImpl();
    }

    @Produces @Demo HelloWorld qualifiedWithDemo() {
        return new HelloWorldDemo();
    }
}

Weld 抱怨

WELD-001409: Ambiguous dependencies for type HelloWorld with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject ....any
  at ....any(HelloWorldDependencyInjectionTest.java:0)
  Possible dependencies: 
  - Producer Method [HelloWorld] with qualifiers [@Default @Any @Named] declared as [[BackedAnnotatedMethod] @Produces @Named ....namedAsDemo()],
  - Producer Method [HelloWorld] with qualifiers [@Default @Any @Named] declared as [[BackedAnnotatedMethod] @Produces @Named ....namedAsImpl()],
  - Producer Method [HelloWorld] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces ....any()]

这正常吗?还是CDI 的工作方式与DI 不同?`

【问题讨论】:

  • 如果我不得不猜测,您违反了 CDI 规范中的 multiple qualifiers。 CDI 确实利用最佳匹配方法来满足注入点,而不是您可能在其他框架中找到的完全匹配。

标签: dependency-injection cdi weld


【解决方案1】:

是的,这是意料之中的。注入点的 Bean 解析受 Highlander 原则控制:“只能有一个。”

来自CDI spec

如果 bean 没有显式声明 @Named 以外的限定符, bean 正好有一个额外的限定符,类型为@Default。这个 被称为默认限定符。

and

如果注入点没有声明限定符,则注入点只有一个限定符,即默认限定符@Default。

所以你的不合格注入点确实是三个bean匹配的。

您的第二个问题CDI 与 DI 不同吗?取决于您对 DI 的定义。如果您的意思是 DI = JSR330,那么答案是肯定的,否则创建新规范毫无意义。

【讨论】:

    猜你喜欢
    • 2017-04-15
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2019-06-07
    • 2018-08-23
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多