在confirmDialog中销毁了RequestScoped bean

gua*_*ito 2 jsf primefaces jsf-2

我有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>
Run Code Online (Sandbox Code Playgroud)

这是对话框:

<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>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 5

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

如果您需要维护与视图相关的数据,那么这不是您想要的.您需要将bean放在视图范围中.只要您通过ajax和return nullvoidin action listener方法与同一视图交互,bean就会存在.请注意,当您返回a时String,即使为空,也会重新创建视图,因此将删除视图范围的bean.

也可以看看: