添加生产者类时的不明确的依赖关系

时间:2015-12-06 19:53:07

标签: cdi

我正在阅读/测试以下关于CDI的教程:[link]

当我在代码中添加一个生产者类时,我得到了一个例外 基本上,有一个默认实现的接口:

public interface ATMTransport {
    public void communicateWithBank(byte[] datapacket);
}


@Default
public class StandardAtmTransport implements ATMTransport {

    public void communicateWithBank(byte[] datapacket) {
        System.out.println("communicating with bank via Standard transport");
    }

}

接下来,还有另一个注入ATMTransport接口的类:

@Named("atm")
public class AutomatedTellerMachineImpl implements AutomatedTellerMachine {

    @Inject
    private ATMTransport transport;

    public void deposit(BigDecimal bd) {
        transport.communicateWithBank(null);
    }

}

到目前为止,一切都还可以。因此,在关于' producer'的部分中,他们展示了一个新类:

public class TransportFactory {

    @Produces ATMTransport createTransport() {
        System.out.println("ATMTransport created with producer");
        return new StandardAtmTransport();
    }

}

然后,通过添加生产者类,我得到了这个例外:

WELD-001409: Ambiguous dependencies for type ATMTransport with qualifiers @Default 
at injection point [BackedAnnotatedField] @Inject private AutomatedTellerMachineImpl.transport at AutomatedTellerMachineImpl.transport(AutomatedTellerMachineImpl.java:0)

Possible dependencies: 
  - Managed Bean [class StandardAtmTransport] with qualifiers [@Default @Any],
  - Producer Method [ATMTransport] with qualifiers [@Any @Default] declared as [[BackedAnnotatedMethod] @Produces TransportFactory.createTransport()]

我通过使用限定符来解决问题,但我真的不知道为什么。

我的问题是,为什么生产者类会导致该异常? (他们在教程中没有提到任何相关内容)。

我真的需要一点解释。

1 个答案:

答案 0 :(得分:0)

根据您提供的代码,您最终创建了一个托管bean的ATMTransport默认实现。异常是由两个bean具有相同的注射目标引起的。 @Default是添加到所有CDI bean的限定符。基本上,不需要生成器方法,因为类定义提供的方法本身是相同的。

我想更大的问题 - 你想用生产者方法做什么?