在我的应用程序中,我有以下 bean:
@Named(value = "mrBean")
@SessionScoped
public class MrBean implements Serializable {
@EJB
private MrsBean mrsBean;
private Item item;
public void updateItem() {
this.item = mrsBean.updateItem(item.getId());
}
}
@Named(value = "itemBean")
@RequestScoped
public class itemBean {
@Inject
private MrBean mrBean;
@PostConstruct
public void init() {
if (FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("update") != null) mrBean.updateItem();
}
}
在 ViewItem.xhtml
页面上显示项目信息之前,我会检查是否提交了 update
参数以在显示之前更新项目。
当我使用参数 update=true
测试页面时,我不知道为什么呈现旧数据而不是新的更新数据。事实上,我必须在呈现新数据之前刷新页面。
从上面的结果来看,我想是不是@PostConstruct
方法是在 View 渲染后调用的。
如果您能给我一个建议,我将不胜感激。
最好的问候,
最佳答案
如果 #{itemBean}
就会发生这种情况在之后 View 中第一次被引用 #{mrBean.item}
.例如
#{mrBean.item}
...
#{itemBean}
当 EL 表达式第一次引用它并且它不存在于作用域中时,托管 beans 被第一次构造。在 GET 请求中,其中托管 bean 实例未被标签处理程序属性或 f:event
引用,那么它只会在渲染响应期间构建。
如果重新排列它们使得 #{itemBean}
总是在之前被引用(并因此构造)#{mrBean.item}
被引用是不可能的,那么最好制作@PostConstruct
的 #{itemBean}
一个<f:event type="preRenderView">
相反。
<f:event type="preRenderView" listener="#{itemBean.init}" />
关于java - JSF 2.0 : data not updated before the view is rendered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11650620/