【问题标题】:How to use qualifier on non default class with java cdi如何使用 java cdi 在非默认类上使用限定符
【发布时间】: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


    【解决方案1】:

    @Video 限定符没有VideoProduct 上的@Alternative 注释应该足以将其注入为:

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

    ProductA,即@Default,应注入以下点:

    @Inject Product x; // no qualifier
    

    【讨论】:

    • 删除视频上的替代注释使视频注释工作,但如果我从 OrderManagementImpl2 中删除 @Video,它会失败并出现错误:WELD-001409:具有限定符 Default 的 Product 类型的不明确依赖项,将 ProductA 和 ProductB 列为类型。当 Video 注释被移除并且只选择默认值时,它似乎并没有忽略 ProductB
    • CDI 规范,par。 2.3.1:“如果 bean 没有显式声明 @Named 以外的限定符,则 bean 恰好有一个额外的限定符,类型为 @Default。”所以实际上两个 bean 都有 @Default 限定符(一个显式,另一个隐式)因此错误。
    • 好的,所以如果你要使用限定符类型,最好不要使用 default 或 Alternative 并让所有东西都成为限定符?
    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 2013-03-05
    • 2021-12-04
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多