gpt4 book ai didi

java - 在 Tomcat 从 SESSIONS.ser 反序列化后,你如何依赖注入(inject)标记为 @Configurable 的 bean?

转载 作者:行者123 更新时间:2023-11-28 22:23:18 24 4
gpt4 key购买 nike

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

问题是标记为@Configurable 的 bean 在被 Tomcat SESSIONS.ser 反序列化时不会被注入(inject)。

我在一个基于 Struts 1.2.9 的(遗留)应用程序上注意到了这种行为,该应用程序使用 Spring 2.5.4、spring-tomcat-weaver-2.5.4、Tomcat 6.0.14。

代码:

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 配置为原型(prototype) bean。

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

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

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

奇怪。

非常感谢任何建议。

最佳答案

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

解决方法 之一是在 Tomcat 关闭/启动期间禁用 session 序列化。通过这种方式,您将从一个全新的 session 开始,一切都将被全新构建和注入(inject)。然而,缺点是每当 Tomcat 重新启动时,最终用户将丢失他们的 session 数据。

为此,添加一个 <Manager>具有 的元素 pathname<Context>有问题的 webapp 的元素。

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

这基本上指示 Tomcat 完全使用 session 管理器。

关于java - 在 Tomcat 从 SESSIONS.ser 反序列化后,你如何依赖注入(inject)标记为 @Configurable 的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4839358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com