Wie zu verwenden qualifier auf "nicht-Standard" - Klasse mit java cdi
Ich versuche, mit @Qualifier zum erstellen einer annotation auf eine Alternative Klasse, die verwendet werden, statt der Standard-Klasse markiert mit @Default. Jedoch , wenn ich dies tun Schweißnaht meldet den Fehler. Ich versuche zu injizieren demo.cdi.ProductB (die Standardeinstellung ist "demo".cdi.ProductA)
Dies ist die Fehlermeldung die ich bekomme:
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]
wenn ich ändern beans.xml durch das hinzufügen weiterer alternativen bekomme ich den folgenden Fehler:
<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>
(der Fehler):
org.jboss.weld.exceptions.DeploymentException: WELD-001409:
Ambiguous dependencies for type Product with qualifiers @Default
Wie erstelle ich die Qualifier-Notationen für die nicht-Standard-Klasse?
den rest der code ist unten als Referenz:
(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;
}
}
(Video):
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();
}
}
InformationsquelleAutor user18896654353 | 2014-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
@Video
qualifier ohne die@Alternative
annotation aufVideoProduct
sollte genug sein, um es zu injizieren, wie:Den
ProductA
, wird@Default
sollte injiziert werden, in Punkten wie:Die CDI-spec, par. 2.3.1: "Wenn eine bean nicht explizit zu deklarieren, mit einem qualifier andere als
@Named
hat die Bohne genau eine zusätzliche qualifier, der Typ@Default
." Also eigentlich beide Bohnen haben die@Default
- qualifier (eine explizit, das andere implizit) damit der Fehler.ok, also, wenn Sie gehen, um qualifier-Typen sein müssen, werden am besten nicht mithilfe der Standard-oder alternative und machen alles, was ein qualifier?
InformationsquelleAutor Nikos Paraskevopoulos