2016-05-13 10 views
14

Ho la seguente sessione di ambito di fagioli:Impossibile deserializzare sessione primaverile con ambito di fagioli

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

e memorizzare le sessioni di Tomcat in un database. Il problema è che, quando l'applicazione tenta di deserializzare una sessione memorizzata, ricevo il seguente errore:

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

Sembra che serializzato in realtà tutto il contesto primavera, e, ovviamente, non esiste una classe de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9 dopo riavvio del server , quindi ricevo l'eccezione di cui sopra.

C'è un modo per evitare questo, in modo che il bean con scope di sessione sia serializzato correttamente?

AGGIORNAMENTO: C'è un numero issue per quanto riguarda ciò che è contrassegnato come risolto senza commenti, tuttavia lo devo ancora affrontare.

+0

Come si memorizzano i dati di sessione nel DB? –

+0

Ho configurato il server Tomcat per archiviare le sessioni nel DB. – vtor

+0

Confuso: @ManagedBean è annotazione JSF, perché hai sia annotazioni JSF e Spring su un singolo bean? –

risposta

0

Avere un bean con una sessione di scope non significa che il bean sia serializzabile e che possa essere memorizzato in una sessione.

Come si può intuire dal nome della classe, una classe proxy viene generata in fase di runtime con un nome diverso ad ogni avvio. Questo spiega perché si verifica un problema durante la deserializzazione.

Immagino che tu provi ad aggiungere questo SessionData come un attributo della sessione web. Non dovresti. Memorizza i tuoi dati POJO nella sessione web senza utilizzare i bean.

Se si utilizza il bean per inserire connessioni al database o oggetti simili, dimenticarlo. È possibile utilizzare solo i bean degli ambiti di sessione per determinati contesti che non soddisfano i requisiti.

+1

Questo è un bean JSF e JSF serializza automaticamente tutti i bean con ambito Session e li archivia in sessione. – vtor

1

Si prega di avere una prova:

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

Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance); 

prima di serializzare.

Nota: questo codice è utile per comprendere il problema, se questo funziona, è necessario analizzare l'architettura del progetto e le dipendenze, per realizzare meglio il codice di produzione. Prima di tutto, perché è necessario serializzare uno

0

io non conosco bene il tuo compito, ma a mio parere un oggetto dati come questo non dovrebbe essere un fagiolo di primavera perché il bean di primavera dovrebbe essere bean di logica aziendale, controller bean e così via e non sessione dto.

per questo motivo considero Thag si dovrebbe cercare di pensare perché si desidera memorizzare i dati del tuo fagioli primavera, e cercare di decopled i dati che si desidera in sessione HTTP, @sessionattribute di SpringMVC, dalla fava logica di business che shoud né essere consapevole della sessione.

i Hooe che questo può aiutare a cambiare la vostra stategy attuazione al fine di trovare la soluzione del problema

Problemi correlati