我正在阅读/测试以下关于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()]
我通过使用限定符来解决问题,但我真的不知道为什么。
我的问题是,为什么生产者类会导致该异常? (他们在教程中没有提到任何相关内容)。
我真的需要一点解释。
答案 0 :(得分:0)
根据您提供的代码,您最终创建了一个托管bean的ATMTransport
默认实现。异常是由两个bean具有相同的注射目标引起的。 @Default
是添加到所有CDI bean的限定符。基本上,不需要生成器方法,因为类定义提供的方法本身是相同的。
我想更大的问题 - 你想用生产者方法做什么?