[英]View-scoped bean recreated on POST when URL parameters not used
我有一个视图范围的 JSF托管bean,支持xhtml视图,我使用f:viewParam从URL读取一个参数。
该视图向用户呈现表单。 但是,当用户通过按p:commandButton提交表单时,似乎重新创建了视图范围的bean(我添加了@PostConstruct注释来验证这一点),因此不记得从f:viewParam读取的实例变量( 见下面的代码)。
我最初使用GET导航到视图,其中包含URL参数,但是当用户按下p时发送的POST消息:commandButton不包含URL参数。 所以我认为当JSF运行时没有在POST上看到URL参数时,它认为这是一个不同的视图,并且正在重新创建JSF管理的bean。 当我将视图范围更改为session-scoped时 ,代码可以正常工作。
这是代码:
<f:metadata>
<f:viewParam name="invId" value="#{registerBean.invId}"/>
</f:metadata>
<h:form id="registrationForm">
....
<p:commandButton value="register" action="#{registerBean.register}"
icon="ui-icon ui-icon-newwin" ajax="false"/>
</h:form>
@ManagedBean
@ViewScoped
public class RegisterBean implements Serializable {
@ManagedProperty(value="#{invId}")
private String invId;
...
事实证明,这与URL参数根本没有关系。 在下面的BalusC建议之后,我删除了c:when我的视图使用的标签(依赖于渲染的属性而不是相同的效果),现在不再重新创建视图范围的bean并正确保留invId字段。
到目前为止发布的代码中看不到这个问题,但是JSF 2.0 / 2.1是一个已知的问题,当一个属性被绑定到像JSTL这样的标记处理程序的属性时,将重新创建一个视图范围的bean <c:if>
或Facelets <ui:include>
或JSF组件的视图构建时属性,例如id
和binding
,同时启用部分状态保存(默认情况下)。
背景说明是在构建和恢复视图期间执行这些属性中的任何EL表达式。 由于视图范围bean存储在视图中,因此仅在恢复视图后可用,因此这样的EL表达式评估将导致创建全新且独立的视图范围bean。 这基本上是鸡蛋问题。 它已在即将推出的JSF 2.2中得到修复。
基本上有3种解决方案:
rendered
替换<c:if>
/ <c:choose>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.