JSF - Für die sitzungsabhängige verwaltete Bean wurden keine Abhängigkeiten bei der Deserialisierung der Sitzung zurückgegeben

8

Ich bin mir nicht sicher, ob das, was ich mache, falsch ist, oder ob ich gerade eine Annotation oder ein Konfigurationselement verpasst habe. Hier ist die Situation:

Ich habe eine JSF-Anwendung mit einer sitzungsspezifischen Bean namens SessionData . Diese Bean hat zum Zeitpunkt der Erstellung einen Verweis auf den Anwendungsbereich (vom Typ ApplicationData ). Dies funktioniert, wenn die Sitzung zum ersten Mal erstellt wird. Die Abhängigkeitsinjektion erfolgt mit <managed-bean> -Elementen in der faces-config.xml -Datei, wie hier gezeigt:

%Vor%

Da es nicht sinnvoll ist, wenn mein Objekt SessionData das Objekt ApplicationData enthält, wenn es serialisiert wird, habe ich den ApplicationData Verweis als transient in meinem Objekt SessionData markiert:

%Vor%

Alles ist gut, bis die Webanwendung gestoppt wird (in meinem Tomcat 6.x-Container) und die Sitzungen serialisiert sind. Wenn ich die Anwendung neu starte und die Sitzungen deserialisiert werden, wird meine Referenz auf ApplicationData nicht von JSF neu injiziert. Ich weiß, dass Deserialisierung vorübergehende Felder ohne Wert verlassen soll. Gibt es eine Möglichkeit, JSF zu signalisieren, dass dieses session-scoped-Objekt erfordert, dass seine Abhängigkeiten nach der Deserialisierung erneut festgelegt werden?

Ich verwende MyFaces JSF 1.2 und Tomcat 6.0.26 als meinen Web-Anwendungscontainer.

    
Jim Tough 23.09.2010, 12:30
quelle

2 Antworten

5

Obwohl die von Bozho angebotene Lösung funktionieren könnte, möchte ich keine Proxy-Objekte in eine Anwendung einführen, die sie derzeit nicht verwendet. Meine Lösung ist weniger als ideal, aber sie erledigt ihre Aufgabe.

Ich habe das transiente Feld an Ort und Stelle gelassen:

%Vor%

Ich habe auch den Setter an Ort und Stelle gelassen, so dass JSF den Verweis anfänglich festlegen kann, wenn das Objekt SessionData das erste Mal erstellt wird:

%Vor%

Die Änderung, die ich vorgenommen habe, war in der Getter-Methode. Methoden im Objekt SessionData müssen jetzt nicht mehr direkt auf das Feld _applicationData zugreifen und stattdessen die Referenz über den Getter abrufen. Der Getter wird zuerst nach einer Nullreferenz suchen. Wenn es null ist, wird die verwaltete Bean über FacesContext erhalten. Die Einschränkung besteht darin, dass FacesContext nur während der Lebensdauer einer Anfrage verfügbar ist.

%Vor%

Wenn es jemanden interessiert, hier ist der Code für meine getManagedBean() -Methode:

%Vor%

Und wählen Sie nicht meine Validate-Anrufe aus. Ich nehme sie raus, nachdem ich mit der Entwicklung fertig bin! :)

    
Jim Tough 23.09.2010, 15:45
quelle
1

Sie können eine Methode hinzufügen:

%Vor%

Und in initializeApplicationData können Sie ein dynamisches Proxy-Objekt verwenden. Mit CGLIB oder javassist erstellen Sie einen Proxy, der vor jedem Methodenaufruf ein internes Feld - das reale ApplicationData - setzt. Wenn es null ist, dann hole die aktuelle FacesContext (auf die zu diesem Zeitpunkt zugegriffen werden kann) und hole die verwaltete Bean von dort:

%Vor%

und delegiere an seine Methoden.

Dies ist ein hässlicher Workaround, aber ich denke, es wird funktionieren.

    
Bozho 23.09.2010 12:35
quelle