Jsf CDI@professional和构造函数注入@Postconstruct
我有以下课程:Jsf CDI@professional和构造函数注入@Postconstruct,jsf,dependency-injection,cdi,postconstruct,Jsf,Dependency Injection,Cdi,Postconstruct,我有以下课程: @Named @ViewScoped public class BaseClass { private SomeDependency dep; public BaseClass(){} @Inject public BaseClass(SomeDependency dep) { this.dep = dep; } @PostConstruct private void initialize() {
@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}" />
IMHO有点违反直觉,产生了大量重复的样板代码,尤其是每个构造函数都有5-6个参数。此外,在创建新的专用bean时,这一点永远不会被发现,因为项目始终是编译干净的
我是做错了什么,还是除了一次又一次地实现构造函数之外没有其他选择
顺便说一句,我确实使用构造函数注入来创建易于测试的类,在这些类中,我可以使用构造函数“注入”依赖项的虚拟实现。CDI 1.1规范第4.3节说: “一个bean完全覆盖第二个bean的唯一方法是 注入点是指它是否实现了所有bean类型并声明 第二个bean的所有限定符。“
您的基类是用命名限定符注释的,而专门化类不是。您还应该用Alternative标记它,并在beans.xml中启用它。还有ViewScope注释。除非它是Omnifaces的ViewScope,否则它看起来像是将JSF托管bean与CDIBean混合在一起。当然,即使默认的原始java实例化也会失败。构造函数不是继承的,除了默认的无参数构造函数。好吧,我知道“原始”实例化,我曾希望CDI逻辑可以减轻我作为程序员的负担…;-)提示:如果bean未实现Serializable,OmniFaces@ViewScoped会引发异常。它是OmniFaces ViewScoped,因为我在JEE6/CDI 1.0上,但1.0在该段落中声明了相同的规范。在那个项目中使用了专门的bean,所有的工作都很好,我只是在尝试注入构造函数逻辑,我希望它能以一种更简单的方式处理。。。
public SpecialClass() {}
@Inject
public SpecialClass(SomeDependency dep) { super(dep); }