2014-01-22 3 views
1

Я пытаюсь использовать @Qualifier для создания аннотации к альтернативному классу, который будет использоваться вместо класса по умолчанию, помеченного с помощью @Default. Однако, когда я делаю это, сообщение об ошибке сообщает об ошибке. Я пытаюсь внедрить demo.cdi.ProductB (по умолчанию demo.cdi.ProductA)Как использовать классификатор класса non default с java cdi

Это ошибка, я получаю:

Exception in thread "main" org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type Product with qualifiers @Video 
    at injection point [BackedAnnotatedParameter] Parameter 1 of [BackedAnnotatedMethod] @Inject public demo.cdi.OrderManagementImpl2.OrderManagementImpl2(@Video Product) 
    at demo.cdi.OrderManagementImpl2.OrderManagementImpl2(OrderManagementImpl2.java:0) 
WELD-001475: The following beans match by type, but none have matching qualifiers: 
    - Managed Bean [class demo.cdi.productA] with qualifiers [@Default @Any] 

если я изменить beans.xml, добавив другие альтернативы, которые я получаю ниже ошибки:

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
    <alternatives> 
     <!-- <class>demo.cdi.ProductA</class> --> 
     <class>demo.cdi.ProductB</class> 
     <class>demo.cdi.ProductC</class> 
     <class>demo.cdi.productD</class> 
    </alternatives> 
</beans>  

(ошибка):

org.jboss.weld.exceptions.DeploymentException: WELD-001409: 
    Ambiguous dependencies for type Product with qualifiers @Default 

Как создать Классификатор обозначения для не-определения ault класс?

остальная часть кода находится ниже для справки:

(ProductA):

package demo.cdi; 
import java.util.LinkedList; 
import javax.enterprise.inject.Default; 

@Default 
public class ProductA implements Product 
{ 
    @Override 
    public LinkedList<Feature> getFeatures() 
    { 
     LinkedList<Feature> rtn = new LinkedList<Feature>(); 
     rtn.add(new Feature("FKA", "FVA")); 
     return rtn; 
    } 

} 

(VideoProduct):

package demo.cdi; 
import java.util.LinkedList; 
import javax.enterprise.inject.Alternative; 
import javax.enterprise.inject.Produces; 

@Alternative 
@Video 
public class VideoProduct implements Product 
{ 
    private VideoProduct() {} 

    @Produces 
    public Product factoryCreate() 
    { 
     return new VideoProduct(); 
    } 

    @Override 
    public LinkedList<Feature> getFeatures() 
    { 
     LinkedList<Feature> rtn = new LinkedList<Feature>(); 
     rtn.add(new Feature("FKB","FVB")); 
     return rtn; 
    } 

} 

(видео):

package demo.cdi;  
import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 
import static java.lang.annotation.ElementType.*; 
import static java.lang.annotation.RetentionPolicy.*;  
import javax.inject.Qualifier;  

@Qualifier 
@Retention(RUNTIME) 
@Target({TYPE, METHOD, FIELD, PARAMETER}) 
public @interface Video 
{ 

} 

(OrderManagementImpl2):

package demo.cdi; 
import javax.inject.Inject; 
import javax.inject.Named; 

public class OrderManagementImpl2 implements OrderManagement 
{ 
    private Product product = null; 

    @Inject 
    public void OrderManagementImpl2(@Video Product _product) 
    { 
     System.out.println(" [ setProduct ] [ _product = "+_product+"]"); 
     this.product=_product; 
    } 

    @Override 
    public void createProduct() 
    { 
     System.out.println(" [ createProduct ] [ product = "+product+"]"); 
    } 
} 

(MainApp2):

package demo.cdi; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import org.jboss.weld.Container; 
import org.jboss.weld.environment.se.Weld; 
import org.jboss.weld.environment.se.WeldContainer; 

public class MainApp2 
{ 
    public static void main(String[] args) 
    { 
     Weld weld = new Weld(); 
     WeldContainer weldContainer = weld.initialize(); 
     OrderManagementImpl2 impl = weldContainer.instance().select(OrderManagementImpl2.class).get(); 
     impl.createProduct(); 
     weld.shutdown(); 
    } 
} 

ответ

1

@Video отборочные без@Alternative аннотацию на VideoProduct должно быть достаточно, чтобы внедрить его как:

@Inject 
public void OrderManagementImpl2(@Video Product _product) { ... } 

ProductA, будучи @Default, следует вводить в такие пункты, как:

@Inject Product x; // no qualifier 
+0

удаление Alternative аннотации на видео делает видео аннотацию работы, но если я удалю @Video от OrderManagementImpl2 он терпит неудачу с ошибкой: WELD-001409: неоднозначными зависимостями для типа продукта с отборочными По умолчанию, листинг ProductA и ProductB как типы. Похоже, что он игнорирует ProductB, когда аннотацию видео удаляется и выбирает только спецификацию CDI по умолчанию – user18896654353

+0

, пар. 2.3.1: «Если компонент не объявляет явным образом квалификацию, отличную от' @ Named', у компонента есть только один дополнительный квалификатор типа '@ Default'." Таким образом, на самом деле обе бины имеют классификатор '@ Default' (один явно, другой неявно), таким образом, ошибка. –

+0

нормально, поэтому, если вы собираетесь использовать типы классификаторов, должно быть, лучше не использовать стандартную или альтернативную вообще и сделать все отборочным? – user18896654353