CDI / WELD可以将自定义限定符与@Named注释结合使用吗?

时间:2013-07-25 07:30:49

标签: jsf-2 jboss7.x cdi weld

具有CDI支持的自定义限定符,如下所示:

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QualifiedFooBean {
}
@QualifiedFooBean
public class FooBean implements ImplFooBean {
}
public interface ImplFooBean {
}

我想直接绑定FooBean#{fooBean},而不需要包装器或处理器(从example看)。注释“Named”(在类FooBean中)似乎不适用于我的类布局。

我的解决方案(没有包装器),我想知道为什么它不工作和调用:目标无法访问,标识符'fooBean'解析为null

@Named
@QualifiedFooBean
public class FooBean implements ImplFooBean {
}

有人有任何想法吗?

2 个答案:

答案 0 :(得分:1)

不需要包装器。我的解决方案完全有效。它还允许在自定义限定符的组合中添加Named(在我的例子中为QualifiedFooBean)。我必须在 WEB-INF 文件夹中创建一个空的 beans.xml 文件,以使CDI正常工作。无论如何问题本身解释了自定义限定符如何工作。您还可以使用以下内容预填bean.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">

</beans>

如果您需要使用CDI配置更多精美的东西,它将作为未来使用的骨架。

答案 1 :(得分:-1)

向您的bean添加@Named应该有效:它适用于我。

事实上@Named是一个限定符,当JSF解析Bean以显示它时会根据@Named限定符执行lokup。在CDI中,如果查找端(即注入点)要求其限定符的子集,则找到bean。

例如一个像这样的bean:

@QualifiedFooBean
@SecondQualifier
public class FooBean {}

将会找到(如果没有模糊的解决方案)
@Inject
@SecondQualifier
FooBean bean;

甚至:

@Inject
FooBean bean;

但不是

@Inject
@SecondQualifier
@ThirdQualifier
FooBean bean;

因此,您可以添加@Named限定符,让CDI解析引擎完成其工作。