【发布时间】:2014-01-22 15:44:03
【问题描述】:
我正在尝试使用@Qualifier 在替代类上创建一个注释,该注释将用于代替标有@Default 的默认类。但是,当我执行此焊接时会报告错误。我正在尝试注入 demo.cdi.ProductB(默认为 demo.cdi.ProductA)
这是我得到的错误:
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
如何为非默认类创建限定符符号?
其余代码参考如下:
(产品A):
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;
}
}
(视频产品):
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();
}
}
【问题讨论】:
标签: java jakarta-ee annotations cdi jboss-weld