如何将依赖项注入(inject)到反序列化的 bean 中?
我的一些 Spring bean 应该在 JSF 应用程序的渲染响应阶段进行序列化,然后在下一个请求开始时进行反序列化。其中一些 Bean 具有仅限于请求范围的依赖项。如果我使用作用域代理 ( "<aop:scoped-proxy>"
) 配置依赖项,我将无法序列化我的依赖 bean - 代理不可序列化。
所以现在我们通过将序列化 bean 类的适当成员变量声明为 transient ,然后调用 context.getAutowireCapableBeanFactory().configureBean(bean, name)
来实现这一点。就在反序列化 bean 之后 - 但这很糟糕,因为 bean 的初始化程序被再次调用。 (至于同一范围内的其他依赖项,不是 transient 的,并且是反序列化的,我什至不确定为什么它们不会被 configureBean
覆盖,但我不认为它们会被覆盖。)
什么更好?我是否应该获取 bean 定义,循环遍历它,找到请求范围内的依赖项,然后调用 getBean(name)
在上下文中?
(顺便说一句,我不确定这有什么区别,但我们使用 Spring 有点奇怪。我们为每个非回发 HTTP 请求实例化一个新的 ClassPathXmlApplicationContext,而不是单个 WebApplicationContext。回发时,我们反序列化 bean。因此,当我说“范围仅限于请求”时,我在撒谎;这些 bean 实际上是单例范围的。我想使用 WebApplicationContext 及其更合理的范围,但到目前为止据我所知,这与我们目前的问题正交。)
最佳答案
这让一切变得不同 - 我已经将 Spring 与 JSF 一起使用了很长一段时间,并且没有遇到任何序列化问题。方法很简单,在您的faces-config.xml 中定义以下内容:
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
这通过向 JSF 页面提供 spring bean(使用 request
和 session
spring 作用域)将 spring 与 JSF 集成。
因此,我建议彻底改变您的方法,这样您将来就不会遇到此类问题。
关于java - 反序列化 bean 需要范围依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336771/