2015-11-29 5 views
0

Я использую 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? `

+0

Если бы я должен был догадаться, вы нарушаете [несколько квалификаторов] (http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#multiple_qualifiers) в спецификации CDI. CDI использует наилучший подход соответствия для удовлетворения точек впрыска, а не точное соответствие, которое вы можете найти в других рамках. –

ответ

3

Да, это ожидается. Разрешение бобов для точек впрыска регулируется принципом горцев: «Там может быть только один».

CDI spec От:

Если фасоль не явно объявлять спецификатор, кроме @Named, фасоль имеет ровно один дополнительный классификатор, типа @Default. Этот называется квалификатором по умолчанию.

and

Если точка впрыска не объявляет спецификатор, точка впрыска имеет ровно один спецификатор, квалификатор по умолчанию @default в.

Таким образом, ваша безоговорочная точка впрыска действительно соответствует трем фасолям.

Ваш второй вопрос Является ли CDI отличным от DI? зависит от вашего определения DI. Если вы имеете в виду DI = JSR330, тогда ответ будет да, иначе не было бы смысла создавать новую спецификацию.