gpt4 book ai didi

jsf - @ManagedBean和@XxxScope可以放在基类中吗?

转载 作者:行者123 更新时间:2023-12-02 01:30:33 25 4
gpt4 key购买 nike

我有两个@ManagedBean (javax.faces.bean.ManagedBean),父级和子级。父代托管 bean 不是抽象的,因为我们必须给予开发人员足够的自由来使用父代(如果足够的话),或者使用具有特定功能的子代来继承它。

我的注入(inject) bean 和 @PostConstruct 有问题父 bean 中的带注释的方法。

以下代码是我发现它有效的唯一方法。

@ManagedBean(name = "myBean")
@SessionScoped
public class BaseBean implements Serializable {
@ManagedProperty(value = "#{serviceManagerController}")
protected ServiceManagerController serviceManagerController;

@PostConstruct
public void init() {
//do things
}
}

还有子bean

public class ChildBean extends BaseBean {
@PostConstruct
public void init() {
super.init();
}
}

要覆盖“myBean”bean 并强制应用程序在需要时使用子 bean,我必须在 faces-config.xml 中声明子 bean

<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>package.ChildBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>serviceManagerController</property-name>
<property-class>package.ServiceManagerController</property-class>
<value>#{serviceManagerController}</value>
</managed-property>
</managed-bean>

这是一切正常的唯一方法,但我不明白一些事情。

  1. 如果我不在faces-config.xml中声明子bean那么 beans 容器总是使用父 bean 实现 @ManagedBean是遗传的。
  2. 父bean中的注入(inject),例如serviceManagerController除非我声明<managed-property>,否则不会执行在 faces-config.xml子bean声明。
  3. @PostConstruct方法不在父子中执行,仅在 @PostConstruct 中执行 child 。因此我必须调用 super.init()在一个空的@PostConstruct子 bean 中的方法

为什么我必须执行这三个步骤才能在父级中进行注入(inject)和 postConstruct 工作?

当然,如果在我的应用程序中我不想继承 BaseBean 并且希望在 Facelets 中使用此 bean,那么一切都可以正常工作。

问候

最佳答案

BaseBean 设计错误。 Bean 管理注释是继承的。从技术上讲,在同一个托管 bean 名称/标识符上注册不同子类的多个实例没有任何意义。 BaseBean 类必须是abstract 并且没有任何bean 管理注释(这样您和JSF 都不会“意外”实例化它)。将这些 Bean 管理放在 ChildBean 上。您的faces-config.xml“修复”基本上就是这样做的。

public abstract class BaseBean implements Serializable {

@ManagedProperty("#{serviceManagerController}")
protected ServiceManagerController serviceManagerController;

@PostConstruct
public void init() {
// ...
}

// ...
}
@ManagedBean("myBean")
@SessionScoped
public class ChildBean extends BaseBean {
// ...
}

托管属性和构造后/销毁前注释是继承的,前提是您尚未在子类中重写它们。因此您不需要重新定义它们。

另请参阅:

关于jsf - @ManagedBean和@XxxScope可以放在基类中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com