在confirmDialog中销毁了RequestScoped bean

时间:2012-05-05 15:22:07

标签: jsf jsf-2 primefaces

我有RequestScoped bean,因为我将用户从dataTable重定向到记录到编辑页面。在这个dataTable中我有删除按钮:

<p:column>
    <p:commandButton update=":deleteNewsDialog" oncomplete="deleteNewsDlg.show()" icon="ui-icon-closethick">
        <f:setPropertyActionListener value="#{news}" target="#{newsBean.news}" />
    </p:commandButton>
</p:column>

这是对话框:

<p:confirmDialog id="deleteNewsDialog" message="Czy na pewno chcesz usunąć wiadomość o tytule &quot;#{newsBean.news.title}&quot;?"
    header="Usuwanie wiadomości" severity="alert"
    widgetVar="deleteNewsDlg" appendToBody="true">
    <h:form>
        <p:commandButton value="Usuń" actionListener="#{newsBean.delete}" update=":newsesTableForm:newsesTable, :newsesTableForm:newsGrowl"/>
        <p:commandButton value="Anuluj" oncomplete="deleteNewsDlg.hide();"/>
    </h:form>
</p:confirmDialog>

当触发newsBean.delete时,newsBean不再存在,因此我得到了许多丑陋的验证异常。我有ViewScoped豆这样的其他页面,它就像一个魅力。帮助

1 个答案:

答案 0 :(得分:5)

请求范围的bean的生命周期恰好是一个HTTP请求/响应。因此,使用表单检索整个视图已经是一个HTTP请求/响应。请求作用域bean在响应结束时被删除。当您在视图上触发ajax请求时,您实际上是在发送新的HTTP请求。这将创建一个新的请求范围bean,它会在HTTP响应结束时被破坏。因此,同一视图上的每个ajax请求都会获得自己的请求范围的bean实例。

如果您需要维护与视图相关的数据,那么这不是您想要的。您需要将bean放在视图范围中。只要您通过ajax与同一视图交互并在动作侦听器方法中返回nullvoid,bean就会存在。请注意,当您返回String时,即使为空,也会重新创建视图,因此视图范围bean将被删除。

另见: