对于项目,我们正在将一些Java应用程序迁移到WebSphere 8.5。在这个过程中,我们试图摆脱一些遗留框架。其中一个是shale(apache attic)。使用shale的唯一组件是视图控制器,用于为每个页面实例化请求范围的jsf托管bean。每个bean都有一个在页面加载时调用的init方法。我想在这个方法上使用@PostConstruct。我唯一的问题是,当bean上的方法被调用时,bean被实例化。不幸的是,bean并不总是被调用,init方法确实在会话范围的bean上填充数据。有一个链接页面和bean的命名约定,因此我们可以使用一个监听器根据请求实例化bean。另一种解决方案可能是将范围更改为viewcope(可能在websphere 8.5上有很多麻烦)。
我想知道我能做些什么来使PostConstruct工作?我还缺少其他选择吗?
编辑: 我有一个PhaseListener来执行基本功能。它将请求的页面与相应的bean匹配(通过命名约定)。以下用于实例化bean但看起来有点难看。
expressionFactory.createValueExpression(elContext, "#{" + managedBeanName + "}", Object.class)
有更优雅的方法吗?
答案 0 :(得分:2)
也许您可以尝试使用<f:event/>
?
在您的视图中,您可以将其添加到页面中。
<f:event type="postAddToView" listener="#{backingBean.myInitMethod()"/>
https://stackoverflow.com/a/14004230/4706826
提供有关事件何时执行的信息。
答案 1 :(得分:-2)
将@PostConstruct注释方法放在辅助bean中。这个注释告诉bean每次调用它的构造函数时都要执行带注释的方法。
示例:
@ManagedBean
@ViewScoped
public class MyManagedBean{
@PostConstruct
public void initView() throws Exception{
...initialize page values, execute database queries, etc.
}