- un cas standard, - vous disposez d'un contrôleur (
@Controller
) avec@Scope("session")
. - les classes les mettre dans la session sont généralement appelés à mettre en œuvre
Serializable
, de sorte qu'ils peuvent être stockés physiquement dans le cas où le serveur est redémarré, par exemple - Si le contrôleur implémente
Serializable
, cela signifie que tous les services (autres beans spring), il se réfère également être sérialisé. Ils sont souvent les procurations, avec des références à des gestionnaires de transaction, l'entité gestionnaire d'usines, etc. - Il n'est pas rare que certaines service de, ou même contrôleur, maintenir une référence à l'
ApplicationContext
, par la mise en œuvre deApplicationContextAware
, donc cela peut effectivement dire que l'ensemble du contexte est sérialisé. Et étant donné qu'il détient de nombreuses connexions à - dire des choses qui ne sont pas sérialisables par l'idée, il sera restauré à la corruption de l'état.
Jusqu'à présent, j'ai surtout fait abstraction de ces questions. Récemment, j'ai pensé à déclarer toutes mes dépendances spring transient
et les ramener en readResolve()
par la statique des classes d'utilitaire WebApplicationContextUtils
et maintenez-la demande/ServletContext en ThreadLocal
. C'est fastidieux, mais elle garantit que, lorsque l'objet est désérialisé, ses dépendances seront "up to date" avec l' actuel contexte de l'application.
Est-il une pratique acceptée pour cela, ou toutes les lignes directrices pour la sérialisation des parties du printemps contexte.
Notez que dans le JSF, géré haricots (~contrôleurs) sont dynamiques (à la différence de l'action à base de frameworks web). Alors peut-être que ma question plus JSF, que pour spring-mvc.