-1

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

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

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

我想知道为什么它不工作和调用的解决方案(没有包装器): Target Unreachable, identifier 'fooBean' resolve to null

@Named
@QualifiedFooBean
public class FooBean implements ImplFooBean {
}

有人知道吗?

4

2 回答 2

1

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

</beans>

如果您需要使用 CDI 配置更多花哨的东西,它将作为将来使用的框架。

于 2013-07-25T10:28:48.527 回答
-1

添加@Named到您的 bean 中应该可以:它对我有用。

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

例如一个像这样合格的bean:

@QualifiedFooBean
@SecondQualifier
public class FooBean {}

将通过以下方式找到(如果没有不明确的解决方案)

@Inject
@SecondQualifier
FooBean bean;

甚至 :

@Inject
FooBean bean;

但不是通过

@Inject
@SecondQualifier
@ThirdQualifier
FooBean bean;

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

于 2013-07-25T08:20:36.040 回答