具有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 {
}
有人有任何想法吗?
答案 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解析引擎完成其工作。