MyFaces не добавляет javax.faces.ViewState обратно при обновлении ajax представления без состояния
У меня возникают проблемы с многократным выполнением одного и того же запроса ajax, который обновляет вложенную форму с помощью JSF без сохранения состояния (MyFaces 2.2.8 + CDI OpenWebBeans 1.2.7, работающий на Tomcat 7).
Вот SSCCE, который будет изображать проблему лучше, чем слова. Давайте рассмотрим простую форму, в которой inputText и outputText привязаны к параметру компонента. Отправка формы просто отображает значение рядом с полем inputText.
test.xhtml
<!DOCTYPE html>
<html lang="fr" xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:view transient="true">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:form>
<h:inputText value="#{testBean.txt}" />
<h:outputText value="#{testBean.txt}" />
<h:commandButton value="Submit">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
</h:form>
</h:body>
</f:view>
</html>
TestBean.java
@Named
@RequestScoped
public class TestBean {
private String txt;
public String getTxt() {
return txt;
}
public void setTxt(String txt) {
this.txt = txt;
}
}
Вряд ли может быть проще! При отправке значения в первый раз, оно работает как положено, и выводится результат. Но когда он передается в другой раз (независимо от значения), поля inputText и outputText очищаются (и метод set не вызывается).
На самом деле, происходит то, что <input type="hidden" autocomplete="off" value="stateless" id="j_id__v_0:javax.faces.ViewState:1" name="javax.faces.ViewState">
изначально добавленный в форму не возвращается при частичном рендеринге. И когда он добавляется вручную в DOM, запрос ajax снова работает.
Это поведение ожидается или это ошибка? Есть ли обходной путь?
Спасибо!
- Зим
1 ответ
Воспроизведенный. Это действительно ошибка MyFaces. Работает на Моджарре (протестировано с 2.2.11).
Вы ничего не можете сделать, кроме как сообщить об ошибке ребятам из MyFaces. Так я и сделал: выпуск 3992.