J'ai essayé simplement:JSF 2.0 Comment créer des UIComponents à économie d'état?
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);
}
}
Je me suis inscrit un gestionnaire d'étiquette et inséré avec succès le composant dans la page. Cependant, lorsque je clique sur le formulaire bleu rendu, JSF recrée le composant (le point d'arrêt du constructeur est intercepté). L'effet de ceci est que toutes les variables d'instance sont perdues. Comment est-il supposé sauvegarder les données dans les composants s'ils sont toujours recréés?
J'ai essayé majeur et l'inspection de l'état des mécanismes de StateHolder
et conjurer PartialStateHolder
wihout chance:
@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 exécute la saveState
lorsque la page et les composants sont créés, mais restoreState
est jamais appelé. En fait, lorsque la requête AJAX est en cours de traitement, une nouvelle instance de UIDemoComponent est créée mais la méthode saveState
est à nouveau appelée , au lieu de restoreState
.
Comment créer un tel composant d'économie d'état (qui conserve les champs d'instance sur les requêtes AJAX)?