2016-05-13 10 views
14

Ich habe die folgende Sitzung scoped Bohne deserialisieren:Unable Spring Session Scoped Bohne

@ManagedBean 
@Component 
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS, value="session") 
public class SessionData implements Serializable {} 

und speichere ich tomcat Sitzungen in einer Datenbank. Das Problem ist, dass, wenn die Anwendung versucht, eine gespeicherte Sitzung deserialisieren, ich die folgende Fehlermeldung:

org.apache.catalina.session.PersistentManagerBase.swapIn Error deserializing Session EE913D2ACAD49EB55EDA657A54DFA2CB: {1} 
java.lang.ClassNotFoundException: de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9 

Es scheint, dass es eigentlich den ganzen Frühling Kontext serialisiert, und natürlich gibt es keine solche Klasse de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9 nach Server neu gestartet , also erhalte ich die vorgenannte Ausnahme.

Gibt es eine Möglichkeit, dies zu vermeiden, damit die Session-Scoped Bean ordnungsgemäß serialisiert wird?

UPDATE: Es gibt eine issue betrachtet dies als behoben, ohne Kommentare, aber ich sehe es immer noch.

+0

Wie Sie speichern die Sitzungsdaten in Ihrer DB zu finden? –

+0

Ich habe Tomcat Server konfiguriert, um Sitzungen in der DB zu speichern. – vtor

+0

Konfus: @ManagedBean ist JSF-Annotation, warum haben Sie sowohl JSF- als auch Spring-Annotationen für eine einzelne Bean? –

Antwort

0

Eine Bean mit einer Scope-Sitzung bedeutet nicht, dass die Bean serialisierbar ist und in einer Sitzung gespeichert werden kann.

Wie Sie aus dem Namen der Klasse erraten können, wird bei jedem Start eine Proxy-Klasse zur Laufzeit mit einem anderen Namen generiert. Dies erklärt, warum bei der Deserialisierung ein Problem auftritt.

Ich vermute, Sie versuchen, diese SessionData als ein Attribut der Web-Sitzung hinzuzufügen. Du solltest nicht. Speichern Sie Ihre POJO-Daten in der Web-Sitzung, ohne Beans zu verwenden.

Wenn Sie die Bean verwenden, um Datenbankverbindungen oder ähnliche Objekte zu injizieren, vergessen Sie es. Sie können Session-Bean für bestimmte Kontexte verwenden, die Ihre Anforderungen nicht erfüllen.

+1

Dies ist JSF-Bean, und JSF serialisiert automatisch alle Session-bezogenen Beans und speichert sie in der Sitzung. – vtor

1

Bitte testen:

mit: import org.springframework.test.util.AopTestUtils;

Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance); 

bevor es serialisiert werden soll.

Hinweis: Dieser Code ist nützlich, um das Problem zu verstehen, wenn dies funktioniert, müssen Sie die Projektarchitektur und Abhängigkeiten analysieren, um den Produktionscode besser zu erreichen. Zunächst einmal, warum müssen Sie eine serialisieren ScopedProxyMode.TARGET_CLASS

0

Ich weiß nicht gut die Ihre Aufgabe, aber meiner Meinung nach sollte ein Datenobjekt wie dieses sollte keine Frühlingsbohne sein, weil Frühjahr Bohnen sollte Business-Logik Bean, Controller sein Bean und so weiter und nicht Session dto.

aus diesem Grund denke ich, dass Sie versuchen sollten, zu denken, warum Sie die Daten Ihrer Frühlingsbohne speichern möchten, und versuchen, die Daten zu dekodieren, die Sie in der http-Sitzung @sessionattribute von springmvc wollen Shoud noch Sitzung Sitzung bewusst sein.

i Hooe, dass dies kann Ihnen helfen, Ihre Implementierung stategy zu ändern, um die Lösung des Problems