繁体   English   中英

@PostConstruct方法无故调用

[英]@PostConstruct method called for no reason

对于一个项目,我正在更新一个Java Web应用程序,该应用程序有一些松散的结局。 我在使用bean的初始化方法时遇到了问题,虽然它不应该这样。

导致问题的页面具有三个按钮,可返回到您之前访问过的三个不同页面。 这两个按钮中的两个会导致您当前所在页面的bean的init方法被调用。 您必须再次按下按钮才能执行操作(=返回到另一页)。 奇怪的是:您可以通过两个菜单选项进入问题页面。 一种导致问题,另一种则不会。 您返回到另一页没有问题。

问题页面的xhtml片段:

<h:commandButton value="Show batch" action="/BatchDetail.xhtml" />
<h:commandButton value="Show messages" action="/BatchMessage.xhtml" />
<c:if test="#{batchMessageDetailBean.batch.part}">
   <h:commandButton value="Show both" action="/BatchAndBatchMessage.xhtml" />
</c:if>

“显示批处理”和“显示消息”引起了问题。 第三个按钮仅通过菜单选项出现,该菜单选项导致前两个按钮出现问题。 奇怪的是,此按钮不会再次调用初始化方法。

我已经读过有关'c:if'引起问题的信息,但是当我完全删除它时,没有任何变化。 Bean是@ViewScoped。 我没有使用Spring。 如果您需要更多详细信息,请询问。

有任何想法吗?

<h:commandXxx>组件通过POST请求提交父表单。 在还原视图阶段,将重新初始化整个页面中引用的所有请求范围的支持Bean。 并且,当使用2.1.18之前的Mojarra版本时, 由于一个鸡蛋漏洞,在视图构建时标记/属性中引用的所有视图作用域Bean也将在还原视图阶段被重新初始化。

因此,这是完全预期的行为。

这里的具体问题是,这些按钮基本上被普通页面间导航所滥用。 您根本不想执行回发。 您只想导航到其他页面。 为此,您应该改用<h:button> 这基本上就像一个GET链接。 另外,浏览器地址栏中的URL将反映在正确的URL上。

<h:button value="Show batch" outcome="/BatchDetail.xhtml" />
<h:button value="Show messages" outcome="/BatchMessage.xhtml" />
<h:button value="Show both" outcome="/BatchAndBatchMessage.xhtml" rendered="#{batchMessageDetailBean.batch.part}" />

请注意,我借此机会通过仅使用rendered属性而不是视图构建时间标签来改善条件渲染,这不仅解决了您使用的Mojarra版本低于2.1.18的问题,而且还起到了积极作用“为工作使用正确的工具”。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM