【问题标题】:RequestScoped bean destroyed in confirmDialog在 ConfirmDialog 中销毁的 RequestScoped bean
【发布时间】:2012-05-14 20:21:26
【问题描述】:

我有 RequestScoped bean,因为我将用户从带有记录的 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 bean,它的工作原理就像一个魅力。帮忙?

【问题讨论】:

  • newsBean 将存在,但它将是一个新实例。请显示错误日志和 newsBean.delete 的实现。
  • 这就是重点!如何维护旧实例而不是获取新实例?错误日志此时将无用,它只是由于 null 新闻属性而导致的一堆验证异常。 delete 方法只是调用 entityManager.remove(entityManager.merge(news)),当然不是直接调用。
  • 将 bean 更改为 ViewScope
  • 不是一个选项,因为我需要在编辑页面上使用它从​​带有 dataTable 的页面重定向。
  • 刚才我意识到我的编辑也不起作用:D。我认为在这种情况下我必须坚持使用 SessionScoped。或者也许有更好的解决方案?

标签: jsf jsf-2 primefaces


【解决方案1】:

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

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

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 2014-02-24
    • 1970-01-01
    • 2014-06-02
    • 2017-04-13
    相关资源
    最近更新 更多