我有一个带有@PostConstruct的BaseBean,以及一个扩展它的bean,我想调用另一个@PostConstruct.我已经阅读了几个可能的地方,但是,似乎首先调用扩展类的@postConstruct(如果第二个被调用的话).然后我在"上下文"上得到一个NPE,因为我假设已经调用了超级bean的PostConstruct.
这可以吗?如果是这样,我做错了什么?
基豆:
@ManagedBean
@RequestScoped
public class BaseBean {
@ManagedProperty(value = "#{contextBean}")
private ContextBean contextBean;
Context context;
@PostConstruct
public void setupContext() {
context = getContextBean().getContext();
}
Run Code Online (Sandbox Code Playgroud)
扩展bean:
@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {
@PostConstruct
public void setUp() {
jsonHelper = context.get(SmartBoxJsonHelper.class);
}
Run Code Online (Sandbox Code Playgroud)
谢谢,Yotam.
Bal*_*usC 10
该@PostConstruct管理bean被创建时后台bean的超类的完全不叫.只有在你的情况下使用EL 时才构造该超类的完全独立的托管bean实例时才调用它#{baseBean}.您最终会有两个完全独立的实例#{baseBean},#{smartBoxSearchBean}其中类自己的@PostConstruct方法在托管bean类本身上独立调用.
这种设计有点奇怪.支持bean的超类通常根本不用作托管bean.
我建议修改你的方法如下:
public abstract class BaseBean {
@ManagedProperty("#{contextBean}")
private ContextBean contextBean;
public Context getContext() {
return contextBean.getContext();
}
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean
@RequestScoped
public class SmartBoxSearchBean extends BaseBean {
@PostConstruct
public void setUp() {
jsonHelper = getContext().get(SmartBoxJsonHelper.class);
}
}
Run Code Online (Sandbox Code Playgroud)
或许这个,如果你根本不需要ContextBean其他目的
public abstract class BaseBean {
@ManagedProperty("#{contextBean.context}")
private Context context;
public Context getContext() {
return context;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,@ManagedProperty以这种方式在超类中声明时工作正常.
更新:根据功能需求,还可以断开豆和刚注入#{baseBean}的{smartBoxSearchBean}.
@ManagedBean
@RequestScoped
public class BaseBean {
@ManagedProperty("#{contextBean}")
private ContextBean contextBean;
private Context context;
@PostConstruct
public void init() {
context = contextBean.getContext();
}
}
Run Code Online (Sandbox Code Playgroud)
和
@ManagedBean
@RequestScoped
public class SmartBoxSearchBean {
@ManagedProperty("#{baseBean}")
private BaseBean baseBean;
@PostConstruct
public void setUp() {
jsonHelper = baseBean.getContext().get(SmartBoxJsonHelper.class);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3804 次 |
| 最近记录: |