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.

Другие вопросы по тегам