Non sono sicuro se ciò che sto facendo è sbagliato, o se ho perso un'annotazione o un elemento di configurazione da qualche parte. Ecco la situazione:JSF - Il bean gestito con ambito sessione non ha re-iniettate dipendenze nella deserializzazione della sessione
Ho un'applicazione JSF con un bean con ambito sessione denominato SessionData
. Questo bean ha un riferimento al bean con ambito applicazione (di tipo ApplicationData
) inserito al suo interno al momento della creazione. Funziona bene quando la sessione viene creata per la prima volta. L'iniezione di dipendenza è fatto con <managed-bean>
elementi nel file faces-config.xml
come illustrato di seguito:
<managed-bean>
<managed-bean-name>sessionData</managed-bean-name>
<managed-bean-class>my.package.SessionData</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>applicationData</property-name>
<property-class>my.package.ApplicationData</property-class>
<value>#{applicationData}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>applicationData</managed-bean-name>
<managed-bean-class>my.package.ApplicationData</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
Perché non ha senso avere il mio SessionData
oggetto includono l'oggetto ApplicationData
quando è serializzato, ho segnato il riferimento ApplicationData
come transitoria nel mio SessionData
oggetto:
transient private ApplicationData applicationData;
Tutto è bene fino a quando si arresta l'applicazione web (nel mio container 6.x Tomcat) e le sessioni sono serializzato. Quando riavvio l'applicazione e le sessioni vengono deserializzate, il mio riferimento a ApplicationData
non viene re-iniettato da JSF. So che la deserializzazione dovrebbe lasciare campi transitori senza un valore. C'è un modo per segnalare a JSF che questo oggetto con ambito sessione richiede che le sue dipendenze vengano nuovamente impostate dopo la deserializzazione?
Sto utilizzando MyFaces JSF 1.2 e Tomcat 6.0.26 come contenitore di applicazioni Web.
È stato suggerito di fornire un metodo readObject() e di impostare manualmente l'oggetto ApplicationData lì durante la deserializzazione utilizzando FacesContext. Non penso che funzionerà poiché FacesContext è disponibile solo durante la vita di una richiesta. La deserializzazione sta accadendo all'avvio dell'applicazione. –
corretto, ecco perché ho cancellato la mia risposta. Sembra più complicato (quindi +1 per la domanda) – Bozho