gpt4 book ai didi

jsf - 在 super bean 和扩展 bean 上调用 @PostConstruct

转载 作者:行者123 更新时间:2023-12-02 11:09:35 27 4
gpt4 key购买 nike

我有一个带有 @PostConstruct 的 BaseBean,以及一个扩展它的 bean,我想在其上调用另一个 @PostConstruct。我读过几个地方说这是可能的,但是,扩展类上的 @postConstruct 似乎首先被调用(如果第二个被调用的话)。然后我在“上下文”上得到一个 NPE,因为我假设 super bean 的 PostConstruct 已经被调用。

这可行吗?如果是这样我做错了什么?

基础 bean:

@ManagedBean
@RequestScoped
public class BaseBean {
@ManagedProperty(value = "#{contextBean}")
private ContextBean contextBean;
Context context;
@PostConstruct
public void setupContext() {
context = getContextBean().getContext();
}

扩展bean:

@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {
@PostConstruct
public void setUp() {
jsonHelper = context.get(SmartBoxJsonHelper.class);
}

谢谢,约塔姆。

最佳答案

当构造托管 bean 时,根本不会调用支持 bean 父类(super class)的 @PostConstruct。仅当该父类(super class)的完全独立托管 bean 实例由例如构建时才会调用。在您的情况下,在 EL 中使用 #{baseBean} 。您实际上最终得到两个完全独立的实例 #{baseBean}#{smartBoxSearchBean},其中独立调用类自己的 @PostConstruct 方法在托管 Bean 类本身上。

这个设计有点奇怪。支持 bean 的父类(super class)通常根本不用作托管 bean。

我建议修改您的方法如下:

public abstract class BaseBean {

@ManagedProperty("#{contextBean}")
private ContextBean contextBean;

public Context getContext() {
return contextBean.getContext();
}

}

@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {

@PostConstruct
public void setUp() {
jsonHelper = getContext().get(SmartBoxJsonHelper.class);
}

}

或者也许是这样,如果您根本不需要 ContextBean 用于其他目的

public abstract class BaseBean {

@ManagedProperty("#{contextBean.context}")
private Context context;

public Context getContext() {
return context;
}

}

请注意,以这种方式在父类(super class)中声明时,@ManagedProperty 工作得很好。

<小时/>

更新:根据功能需求,您还可以解耦bean,只需在{smartBoxSearchBean}中注入(inject)#{baseBean}即可>.

@ManagedBean
@RequestScoped
public class BaseBean {

@ManagedProperty("#{contextBean}")
private ContextBean contextBean;
private Context context;

@PostConstruct
public void init() {
context = contextBean.getContext();
}

}

@ManagedBean
@RequestScoped
public class SmartBoxSearchBean {

@ManagedProperty("#{baseBean}")
private BaseBean baseBean;

@PostConstruct
public void setUp() {
jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class);
}

}

关于jsf - 在 super bean 和扩展 bean 上调用 @PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11214146/

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