【问题标题】:How do you dependency inject beans marked @Configurable after deserialized by Tomcat from SESSIONS.ser?Tomcat 从 SESSIONS.ser 反序列化后,如何依赖注入标记为 @Configurable 的 bean?
【发布时间】:2011-01-29 20:52:49
【问题描述】:

注意:除非您非常熟悉 Java、Spring AOP 和 Tomcat,否则这没有任何意义。

问题是标记为@Configurable 的bean 在被Tomcat SESSIONS.ser 反序列化时没有注入。

我在带有 Spring 2.5.4、spring-tomcat-weaver-2.5.4、Tomcat 6.0.14 的基于 Struts 1.2.9 的(旧版)应用程序上注意到了这种行为。

代码:

public class MyForm implements Serializable {
   private Foo myFoo; // getters and setters
}

public class Foo imlements Serializable {
   private Bar myBar; // getters setters
}

@Configurable("barTemplate")
public class Bar implements Serializable {
   @Autowired(required=true)
   private transient SessionFactory hello;
   // other transient dependencies ...
}

XML 将 Bar 配置为原型 bean。

应用了正确的 context:spring-configured 和 context:load-time-weaver 设置等(因为它适用于 Tomcat 的冷启动)。

第一次启动时一切正常。但是,重新启动 Tomcat 会导致写入 SESSIONS.ser 并在重新启动时反序列化 MyForm,它会这样做。但是,没有设置 Bar 中的任何依赖项!

但是如果我关闭 Tomcat,删除 SESSIONS.ser 文件,然后重新启动,那么一切都会正常工作。

很奇怪。

非常感谢任何建议。

【问题讨论】:

    标签: java serialization tomcat spring-aop configurable


    【解决方案1】:

    我将跳过 Spring 部分,因为我不这样做。但是我必须承认,我还希望 Spring 足够聪明,可以在反序列化后重新注入它们(编辑:这似乎是 Spring 2.5.2 中的fixed?)。

    解决方法之一是在 Tomcat 关闭/启动期间禁用会话序列化。这样,您将从一个全新的会话开始,一切都将重新构建和注入。然而,缺点是一旦 Tomcat 重新启动,最终用户将丢失他们的会话数据。

    要实现这一点,请将带有 empty pathname<Manager> 元素添加到相关 web 应用的 <Context> 元素中。

    <Context ...>
        <Manager pathname="" />
    </Context>
    

    这基本上指示 Tomcat 使用 no 会话管理器。

    【讨论】:

    • 我测试了设置路径名并且它有效(阻止了 tomcat 从 SESSIONS.ser 恢复会话)。
    • 我们似乎在使用 spring 2.5.4 ...我在自己研究问题时也看到了这个错误。它似乎仅适用于在 @Configurable 上设置 preConstruction=true 时(这意味着将在调用构造函数之前注入依赖项 - 有点奇怪,嗯?)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2014-06-28
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多