我有一个 JSF 页面,它显示来自名为TableQuery的对象的表,该对象支持有状态分页、排序等。访问该对象的 bean 是一个 RequestScoped 对象,它试图通过将TableQuery存储在 flash 映射中来保留它。访问器方法如下所示:
public TableQuery<SysLog> getQuery() {
if (query != null) return query;
Flash flash = FacesContext.getCurrentInstance().
getExternalContext().getFlash();
query = (TableQuery) flash.get("Query");
if (query != null) System.out.println("TableSysLog.getQuery() Got query from flash!");
if (query == null) {
query = slc.getNewTableQuery();
System.out.println("TableSysLog.getQuery() Created new query");
}
flash.put("Query", query);
return query; }
页面之间的链接是用p:commandLInk实现的。我在 AJAX 模式下使用 Primefaces 命令链接,因此只有在单击链接时才会处理该链接。动作侦听器如下所示:
public void doNextPage(ActionEvent evt) {
getQuery().doNextPage();
}
当它不起作用时,我收到错误消息:
WARNING: JSF1095: The response was already committed by the time we tried to set the outgoing cookie for the flash. Any values stored to the flash will not be available on the next request.
我在查找此问题时发现了此线程。当我按照文章的建议关闭 HTTP 分块时,错误消息消失了,但问题仍然存在。
有谁知道发生了什么以及如何解决这个问题?
更新:
在处理这个问题时,我相信我已经发现了一个用于存储 Flash 对象的 cookie 的错误。它存储的 cookie 名为csfcfc,cookie 的路径参数是我的应用程序的根,在我的例子中是“/A/”。
但是,当它失败时,我得到了第二个csfcfc cookie,这次的路径参数为“/A//”。我的工作理论是cookie生成器有时会在路径参数中添加一个额外的“/”,这意味着即使浏览器发送了cookie,在下一个请求中也看不到cookie。
值得注意的是,这种情况非常间歇性地发生。我并不总是收到JSF1095消息,但每次查看时我都会收到额外的 cookie。
我不知道这是 Mojarra 错误还是 Glassfish 错误,但我在这篇文章中添加了 Mojarra 标签。我不熟悉这些产品的错误数据库,但是有人可以在这里评论下一步应该是什么吗?
我将不胜感激有关解决方法的任何建议