我有以下课程:
@Named
@ViewScoped
public class BaseClass {
private SomeDependency dep;
public BaseClass(){}
@Inject
public BaseClass(SomeDependency dep) {
this.dep = dep;
}
@PostConstruct
private void initialize() {
dep.doSomething(); // Point "A"
}
public String getProperty() {
return "BaseClass-Property";
}
@Specializes
public class SpecialClass extends BaseClass() {
@Override
public String getProperty() {
return "SpecialClass-Property";
}
}现在在一些.xhtml中,我有这样的东西
<h:outputText value="#{baseClass.property}" />没有SpecialClass,这很好。如果我在项目中包括了NullPointerException,它就会与"A“点处的SpecialClass中断。
好吧,根据符合焊接规范的说法,这或多或少是有意的行为:
当启用的bean专门处理另一个bean时,另一个bean永远不会被容器实例化或调用。
不过,现在我必须确保每个@Specializes bean都实现完整的构造函数,如
public SpecialClass() {}
@Inject
public SpecialClass(SomeDependency dep) { super(dep); }其中IMHO有点违反直觉,产生了很多重复的样板代码,特别是为每个构造函数设置了5-6个参数。而且,在创建新的专门化bean时,这是永远不会被捕获的,因为项目始终是编译干净的。
我是做错了什么,还是除了一遍又一遍地实现构造函数之外,没有别的选择?
顺便说一句,我确实使用了Constructor注入来创建容易测试的类,在这里我可以使用构造函数“注入”依赖项的虚拟实现。
发布于 2015-03-20 05:05:22
第4.3节的CDI 1.1规范说:
“一个bean在所有注入点上完全覆盖第二个bean的唯一方法是实现所有bean类型并声明第二个bean的所有限定符。”
基类使用命名限定符进行注释,而专门化类则不是。您还应该使用Alternative标记它并在beans.xml中启用它。还有ViewScoped注释。除非是Omnifaces的ViewScoped,否则您似乎将与CDI混为一谈。
https://stackoverflow.com/questions/29142345
复制相似问题