一尘不染

Spring会话范围的Bean(控制器)和对服务的引用(根据序列化)

java

  • 一个标准的案例-你有一个带有的控制器(@Controller@Scope("session")
  • 通常希望实现会话中放置的类,Serializable以便在重新启动服务器的情况下可以物理存储它们,例如
  • 如果控制器实现Serializable,这意味着它引用的所有服务(其他spring bean)也将被序列化。它们通常是代理,并引用事务管理器,实体管理器工厂等。
  • 某些服务,甚至控制器,都不太可能ApplicationContext通过实现实现对的引用ApplicationContextAware,因此这可以有效地意味着整个上下文都已序列化。并且考虑到它拥有许多连接-即无法通过思想序列化的事物,它将以损坏状态恢复。

到目前为止,我几乎都忽略了这些问题。最近,我想到了声明我所有的spring依赖项,transientreadResolve()通过静态实用程序类将它们重新获得WebApplicationContextUtils,从而将request
/ ServletContext保留在ThreadLocal。这很繁琐,但是可以保证在反序列化对象时,其依赖关系将与 当前
应用程序上下文保持“最新” 。

是否对此有任何公认的实践,或者是否有任何序列化spring上下文部分的准则。

请注意,在JSF中,托管bean(〜controllers)是有状态的(与基于动作的Web框架不同)。因此,也许我的问题更多地代表JSF,而不是spring-
mvc。


阅读 248

收藏
2020-09-09

共1个答案

一尘不染

此演示文稿中(大约1:14),发言者说,此问题在Spring 3.0中通过提供不可序列化的Bean代理得以解决,该代理可从 当前
应用程序上下文中获取实例(反序列化)

2020-09-09