Я пытаюсь использовать @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();
}
}
удаление Alternative аннотации на видео делает видео аннотацию работы, но если я удалю @Video от OrderManagementImpl2 он терпит неудачу с ошибкой: WELD-001409: неоднозначными зависимостями для типа продукта с отборочными По умолчанию, листинг ProductA и ProductB как типы. Похоже, что он игнорирует ProductB, когда аннотацию видео удаляется и выбирает только спецификацию CDI по умолчанию – user18896654353
, пар. 2.3.1: «Если компонент не объявляет явным образом квалификацию, отличную от' @ Named', у компонента есть только один дополнительный квалификатор типа '@ Default'." Таким образом, на самом деле обе бины имеют классификатор '@ Default' (один явно, другой неявно), таким образом, ошибка. –
нормально, поэтому, если вы собираетесь использовать типы классификаторов, должно быть, лучше не использовать стандартную или альтернативную вообще и сделать все отборочным? – user18896654353