【发布时间】:2012-09-14 08:17:51
【问题描述】:
我有一个 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:commandLInks 实现的。我在 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.
我在查找此问题时找到了this thread。当我按照文章的建议关闭 HTTP 分块时,错误消息消失了,但问题仍然存在。
有谁知道发生了什么以及如何解决这个问题?
更新:
在处理这个问题时,我相信我已经发现了一个用于存储 flash 对象的 cookie 的错误。它存储的 cookie 名为 csfcfc,该 cookie 的 path 参数是我的应用程序的根,在我的例子中是“/A/”。
但是,当它失败时,我得到了第二个 csfcfc cookie,这次的路径参数为“/A//”。我的工作理论是cookie生成器有时会在路径参数中添加一个额外的“/”,这意味着即使浏览器发送了cookie,在下一个请求中也看不到cookie。
值得注意的是,这种情况非常间歇性地发生。我并不总是收到 JSF1095 消息,但每次查看时都会收到额外的 cookie。
我不知道这是 Mojarra 错误还是 Glassfish 错误,但我在这篇文章中添加了 Mojarra 标签。我不熟悉这些产品的错误数据库,但有人可以在这里评论下一步应该是什么吗?
如果有任何解决方法的建议,我将不胜感激
【问题讨论】:
-
AFAIK 如果您想要排序/过滤,您应该(最少)为您的数据表使用视图范围的支持 bean。您使用此“解决方案”的任何特殊原因?
-
在屏幕上维护表格所需的所有状态(起始记录、排序条件、过滤条件、页面大小等)都存储在 TableQuery 对象中。我尝试使用 ViewScoped,但它不起作用——每次请求都会重新创建支持 bean。因此,如果 flash 作用域变量将我的状态从一个请求保存到下一个请求。
-
我不熟悉 flash 范围,但 session 范围没有提供您要查找的内容吗?
-
会话范围 bean 会得到我想要的行为,但 bean 会在整个会话中徘徊。如果用户离开页面并返回,该状态仍然存在,这是不希望的。这也消耗了数千个会话 bean 的不必要的服务器资源。
标签: jsf-2 primefaces glassfish-3 mojarra