java - 就序列化而言,Spring session 范围的 bean( Controller )和对服务的引用

标签 java spring serialization jsf servlets

  • 一个标准案例 - 你有一个带有 @Scope("session") 的 Controller (@Controller)。
  • 放置在 session 中的类通常需要实现 Serializable,以便在服务器重启时可以物理存储它们,例如
  • 如果 Controller 实现了Serializable,这意味着它所引用的所有服务(其他spring bean)也将被序列化。它们通常是代理,引用事务管理器、实体管理器工厂等。
  • 通过实现 ApplicationContextAware,某些服务甚至 Controller 持有对 ApplicationContext 的引用并非不可能,因此这实际上意味着整个上下文是序列化。并且鉴于它拥有许多连接 - 即无法通过想法序列化的事物,它将在损坏状态下恢复。

到目前为止,我大多忽略了这些问题。最近我想声明​​我所有的 spring 依赖项 transient 并通过静态实用程序类 WebApplicationContextUtils 将它们返回到 readResolve() 中,这样就可以保存ThreadLocal 中的请求/ServletContext。这很乏味,但它保证当对象被反序列化时,它的依赖关系将与 当前 应用程序上下文“最新”。

是否有任何公认的做法,或序列化部分 Spring 上下文的任何指南。

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

最佳答案

this presentation (大约 1:14)演讲者说这个问题在 spring 3.0 中通过提供不可序列化 bean 的代理得到解决,该代理从 当前 应用程序上下文(反序列化)获取实例

关于java - 就序列化而言,Spring session 范围的 bean( Controller )和对服务的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180963/

相关文章:

java - 如何在Java中检测矩形的哪条边被击中

java - 失败时显示查询绑定(bind)的参数

java - Tapestry 返回区和流响应

java - 上下文初始化期间遇到异常 - 取消刷新尝试

java - Spring:通用注入(inject)不起作用

spring - Rest 自定义 HTTP 消息转换器 Spring Boot 1.2.3

java - ObjectOutputStream 的对象如何调用 Serialized 对象的私有(private) writeObject 方法

java - JDBC - 尝试插入值时出现 NullPointerException

Java Jackson 序列化器获取变量名称

c# - 反序列化接口(interface)集合时,使用自定义转换器从以前的数据模型反序列化 JSON 失败