JSF中的Ajax表单更新显示了ViewExpiredException

时间:2014-06-09 13:03:16

标签: java jquery jsf jsf-1.2 viewexpiredexception

我有一个jsf 1.2应用程序,在索引页面中有一些链接。在新的jquery对话框上点击此链接。每个链接都在一个不同的对话框中打开我的应用程序的新页面,因此,应用程序可以在一个页面中的许多对话框中打开许多链接。我所有的托管bean都有会话范围。

我的问题是,当我打开一个新对话框并点击里面的任何链接时,我的应用程序仍然正常,但在此之后,如果我点击我的索引页面中的其他链接打开另一个对话框,该应用程序显示我ViewExpiredException。我尝试将我的jsf更新为2.0,将EnableRestoreView11Compatibility中的web.xml设置为true,在我的bean中使用keepAlive,但没有任何效果。

我认为这是因为我有一个主页面有一个状态,当我点击在jquery对话框中打开一个新页面时,它会加载整个页面并将html放入其中。因此,请求没有引用主页的状态。我怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

似乎JSF中的错误尚未修复,计划在JSF 2.3中修复

您可以使用java.net中针对jquery发布的以下解决方法。

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-790

var patchJSF = function () {
  jsf.ajax.addOnEvent(function (e) {
    if (e.status === 'success') {
      $("partial-response:first changes:first update[id='javax.faces.ViewState']", 
       e.responseXML).each(function (i, u) {
        // update all forms
        $(document.forms).each(function (i, f) {
          var field = $("input[name='javax.faces.ViewState']", f);
          if (field.length == 0) {
           field = $("<input type=\"hidden\" name=\"javax.faces.ViewState\" />").
                    appendTo(f);
          }
          field.val(u.firstChild.data);
        });
      });
    }
  });
}