繁体   English   中英

当未使用URL参数时,在POST上重新创建视图范围的bean

[英]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组件的视图构建时属性,例如idbinding ,同时启用部分状态保存(默认情况下)。

背景说明是在构建和恢复视图期间执行这些属性中的任何EL表达式。 由于视图范围bean存储在视图中,因此仅恢复视图可用,因此这样的EL表达式评估将导致创建全新且独立的视图范围bean。 这基本上是鸡蛋问题。 它已在即将推出的JSF 2.2中得到修复。

基本上有3种解决方案:

  1. 相应地更改视图,以便仅在视图渲染时评估这些EL表达式。 例如,通过rendered替换<c:if> / <c:choose>
  2. 或者将这些属性绑定到请求范围的bean(设计通知:您可以将视图范围的bean注入请求范围的bean的托管属性)。
  3. 关闭部分状态保存,必要时仅针对特定视图。

也可以看看:

暂无
暂无

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

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