これは、JSF仕様の問題790に関連しており、要約すると、1つ以上の<h:form>
コンポーネントを含むコンポーネントを更新しても、それらのフォームの新しいビューステート識別子が適切に更新されません。
この問題は、今後のJSF 2.2で修正されますが、それまでは、次のJavaScriptベースの回避策を使用する必要があります。
jsf.ajax.addOnEvent(function(data) {
if (data.status == "success") {
var viewState = getViewState(data.responseXML);
if (viewState) {
for (var i = 0; i < document.forms.length; i++) {
var form = document.forms[i];
if (!hasViewState(form)) {
createViewState(form, viewState);
}
}
}
}
});
function getViewState(responseXML) {
var updates = responseXML.getElementsByTagName("update");
for (var i = 0; i < updates.length; i++) {
var update = updates[i];
if (update.getAttribute("id") == "javax.faces.ViewState") {
return update.firstChild.nodeValue;
}
}
return null;
}
function hasViewState(form) {
for (var i = 0; i < form.elements.length; i++) {
if (form.elements[i].name == "javax.faces.ViewState") {
return true;
}
}
return false;
}
function createViewState(form, viewState) {
var hidden;
try {
hidden = document.createElement("<input name='javax.faces.ViewState'>"); // IE6-8.
} catch(e) {
hidden = document.createElement("input");
hidden.setAttribute("name", "javax.faces.ViewState");
}
hidden.setAttribute("type", "hidden");
hidden.setAttribute("value", viewState);
hidden.setAttribute("autocomplete", "off");
form.appendChild(hidden);
}
エラーページの<h:outputScript name="some.js" target="head">
中に含めるだけです。<h:body>
ページがJSFを使用していることを保証できない場合は、呼び出す前にチェック<f:ajax>
を追加することをお勧めします。if (typeof jsf !== 'undefined')
jsf.ajax.addOnEvent()
JSFコンポーネントライブラリPrimeFacesは、コアajaxエンジンでこの問題をすでに解決しているため、すでに使用している場合は、すべての<f:ajax>
リンク/ボタンをPrimeFacesのものに置き換えることをお勧めします。
参照: