【问题标题】:Cannot create a session after the response has been committed - PrettyFaces MultiPageMessagesSupport on Glassfish4提交响应后无法创建会话 - Glassfish4 上的 PrettyFaces MultiPageMes​​sagesSupport
【发布时间】:2013-06-19 05:15:01
【问题描述】:

我有一个使用 JSF2 + PrettyFaces + EBJ3 + Glassfish 的 Java EE 应用程序

我最近刚刚更新到 Glassfish4,它是 Java EE 7 的默认服务器实现,我开始遇到 PrettyFaces 的问题。

我已经在我的 faces-config.xml 上进行了配置:

<lifecycle>
  <phase-listener>com.ocpsoft.pretty.faces.event.MultiPageMessagesSupport</phase-listener>
</lifecycle>     

使 Faces 消息能够正确传递并显示在屏幕上。

但自从我从 Glassfish3 升级到 4 后,我开始遇到这个问题:

java.lang.IllegalStateException:响应后无法创建会话 已承诺 ...

        at com.ocpsoft.pretty.faces.util.FacesMessagesUtils.saveMessages(FacesMe
ssagesUtils.java:56)
        at com.ocpsoft.pretty.faces.event.MultiPageMessagesSupport.afterPhase(Mu
ltiPageMessagesSupport.java:66)

如果我从 faces-config.xml 中删除侦听器,屏幕上不会显示任何 Faces 消息。

我正在使用 PrettyFaces 来获得格式良好的 URL,以增强我网站上的 SEO。我希望我不必替换它或重构我的应用程序以不使用它,因为我已经使用它映射了很多导航流。有人知道这种情况的更好选择吗? 我真的很感激任何建议。谢谢。

【问题讨论】:

  • 我不是 PrettyFaces 方面的专家,但调整 state saving method 可能有助于解决这个问题。 GF4 附带的 JSF2.2 尚未正式发布,所以这是某个地方的错误(或某些不兼容)。

标签: jsf-2 prettyfaces glassfish-4


【解决方案1】:

如果您要部署到支持 JSF 2.2 的“现代”容器,我不建议使用 MultiPageMessagesSupportMultiPageMessagesSupport 相位监听器是为 JSF 1.x 开发的。 JSF 2.x 添加了对跨重定向消息持久化的支持。只需在重定向之前执行此代码:

FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);

【讨论】:

  • 那么我必须在每个返回“pretty:”或“pretty:something”的 JSF 导航案例之前放置这行代码?
  • 是的,或者您可以编写一个 PhaseListener,在 RESTORE_VIEW 或类似的东西之后的每个请求上调用此方法。老实说,我不确定这种做法的常见做法是什么。我自己有一个 Messages 帮助器类,我用它来排队消息,它总是在将消息添加到队列后设置此标志。
猜你喜欢
  • 2012-06-12
  • 2017-03-06
  • 2012-06-06
  • 2013-05-29
  • 2021-09-24
  • 1970-01-01
  • 2014-12-08
  • 2013-12-02
相关资源
最近更新 更多