2017-07-06 4 views
1

I eine JSF Verbund bin zu entwickeln, die eine komplexe Datenstruktur als Argument erhält:JSF Verbund nicht speichert Zustand mit StateHelper

<cc:interface componentType="MyComponent"> 
    <cc:attribute name="myModel" required="true"  type="my.package.Model" /> 
</cc:interface> 

das unterstützende Komponente verarbeitet dieses Modell eine init() Methode, die in der aufgerufen wird, Verbund über ein Ereignis:

<cc:implementation> 
     <f:event type="postAddToView" listener="#{cc.init}" /> 
     [...] 
    </cc:implementation> 

In diesem init() Methode, die ich prüfen, ob das Modell bereits verarbeitet worden ist (weil ich, dass jedes Mal nicht tun möchte der Benutzer auf der Seite bleibt, zB durch aJAX-Anfragen). Daher speichere ich das bearbeitete Modell über StateHelper.put():

public void init() 
{ 
    if (getMyModel() == null) 
    { 
     MyModel model = processModel(...); 
     setMyModel(model); 
    } 
} 

@SuppressWarnings("unchecked") 
public MyModel getMyModel() 
{ 
    return (MyModel) getStateHelper().get("MyModel"); 
} 

public void setMyModel(MyModel MyModel) 
{ 
    getStateHelper().put("MyModel", MyModel); 
} 

ich jetzt erwarten, dass, wenn die Methode init() zum Beispiel während eines Ajax-Request (in dem gleichen Ansicht scope) aufgerufen wird, es nicht tut Prozess das Modell ein zweites Mal, weil ich es über den StateHelper im View-Scope gespeichert habe. Aber egal, was ich versuche, wenn ich auf eine Befehlsverbindung mit void/null outcome klicke, gibt die Methode getMyModel() immer null zurück. Irgendwelche Ideen?

Antwort

2

Die Implementierung der restoreState()-Methode in der Sicherungskomponente und das Festlegen eines Haltepunkts haben das Problem aufgezeigt. Das postAddToView-Ereignis wird verarbeitet vor der Aufruf von restoreState(). Die Verwendung von preRenderView löste stattdessen das Problem für mich.