Я использую weld-se
для тестирования одного из моих аннотированных классов JSR-330
.Как я могу заставить Weld отличить [@ Default @ Any @ Named] от [@ Default @ Any]?
@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
? `
Если бы я должен был догадаться, вы нарушаете [несколько квалификаторов] (http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#multiple_qualifiers) в спецификации CDI. CDI использует наилучший подход соответствия для удовлетворения точек впрыска, а не точное соответствие, которое вы можете найти в других рамках. –