gpt4 book ai didi

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

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

我有两个@ManagedBean(javax.faces.bean.ManagedBean),父级和子级。父级托管bean不是抽象的,因为我们必须给予开发人员自由,以便在足够使用父级的情况下使用它,或者将其继承给具有特殊功能的子级。

我在注入bean和父bean中带有@PostConstruct注释的方法时遇到问题。

以下代码是我发现它起作用的唯一方法。

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

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


和子豆

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>


那是所有工作的唯一方法,我不明白某些事情。


如果我没有在 faces-config.xml中声明子bean,那么尽管 @ManagedBean是继承的,但是bean容器始终使用父bean实现。
除非我在 serviceManagerController子bean声明中声明 <managed-property>,否则不会执行像 faces-config.xml这样的父bean中的注入。
@PostConstruct方法不会在父级子级中执行,只是在 @PostConstruct子级中执行。因此,我必须在子bean中的空 super.init()方法中调用 @PostConstruct


为什么我必须执行这三个步骤才能在父级工作中进行注入和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 {
// ...
}

但是,如果您尚未在子类中覆盖托管属性和构造后/销毁前注释,则它们将被继承。因此,您无需重新定义它们。
也可以看看:

Can @ManagedPropery and @PostConstruct be placed in a base class?

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

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