1

注意:除非您非常熟悉 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 文件,然后重新启动,那么一切都会正常工作。

诡异的。

非常感谢任何建议。

4

1 回答 1

1

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

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

为此,请向相关 web 应用程序的元素添加一个<Manager> pathname<Context>元素。

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

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

于 2011-01-29T21:46:56.200 回答