注意:除非您非常熟悉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文件,然后重新启动,那么一切都会正常工作。
怪异。
任何建议都非常感谢。
答案 0 :(得分:1)
我会跳过Spring部分,因为我没有这样做。但我必须承认,我也期望Spring能够在反序列化后重新注入它们(编辑:这在Spring 2.5.2中似乎是fixed。)。 / p>
其中一个变通办法将在Tomcat关闭/启动期间禁用会话序列化。这样你就可以从一个全新的会话开始,一切都将刚刚构建和注入。然而,缺点是当Tomcat重新启动时,endusers将丢失其会话数据。
要实现此目的,请将<Manager>
元素与空 pathname
添加到相关网络应用的<Context>
元素中。
<Context ...>
<Manager pathname="" />
</Context>
这基本上指示Tomcat使用 no 会话管理器。