Я попробовал просто:
public class UIDemoComponent extends UIComponentBase {
private String someVariable; // this gets always cleared, getters/setters omitted
public UIDemoComponent() {
super(); // place breakpoint here
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
HtmlForm form = new HtmlForm();
form.setStyle("padding: 10px; background-color: blue;");
getChildren().add(form);
AjaxBehavior behavior = new AjaxBehavior();
behavior.setRender(Arrays.asList("@form"));
form.addClientBehavior("click", behavior);
}
}
Я зарегистрировал обработчик тега и успешно вставил компонент на страницу. Однако, когда я щелкаю синюю форму, которая отображается, JSF повторно создает компонент (точка останова в конструкторе перехватывается). В результате все переменные экземпляра теряются. Как сохранить данные в компоненты, если они всегда создаются заново?
Я пытался переопределить и проверить механизмы сохранения состояния StateHolder
и PartialStateHolder
без удачи:
@Override
public Object saveState(FacesContext context) {
return super.saveState(context); // breakpoint
}
@Override
public void restoreState(FacesContext context, Object state) {
super.restoreState(context, state); // breakpoint
}
JSF выполняет saveState
при создании страницы и компонентов, но restoreState
никогда не вызывается. На самом деле, когда обрабатывается AJAX-запрос, создается новое условие UIDemoComponent, но метод saveState
снова вызывается вместо restoreState
.
Как создать такой компонент, сохраняющий состояние (который сохраняет поля экземпляра по запросам AJAX)?