在SESSIONS.ser中通过Tomcat反序列化之后,如何依赖注入标记为@Configurable的bean?

时间:2011-01-29 20:52:49

标签: java serialization tomcat spring-aop configurable

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

问题是当Tomcat SESSIONS.ser反序列化时,不会注入标记为@Configurable的bean。

我在使用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。

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

第一次开始时一切正常。但是,重新启动Tomcat会导致写入SESSIONS.ser并在重新启动时反序列化MyForm,它会执行此操作。但是,没有设置Bar中的依赖项!

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

怪异。

任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

我会跳过Spring部分,因为我没有这样做。但我必须承认,我也期望Spring能够在反序列化后重新注入它们(编辑:这在Spring 2.5.2中似乎是fixed。)。 / p>

其中一个变通办法将在Tomcat关闭/启动期间禁用会话序列化。这样你就可以从一个全新的会话开始,一切都将刚刚构建和注入。然而,缺点是当Tomcat重新启动时,endusers将丢失其会话数据。

要实现此目的,请将<Manager>元素与 pathname添加到相关网络应用的<Context>元素中。

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

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