如何将依赖项注入反序列化的bean?
我的一些Spring bean应该在JSF应用程序的呈现 - 响应阶段序列化,然后在下一个请求开始时反序列化。其中一些bean具有作用于请求的依赖项。如果我使用作用域代理("<aop:scoped-proxy>"
)配置依赖项,我无法序列化我的依赖bean - 代理不可序列化。
现在我们通过将序列化bean类的相应成员变量声明为transient,然后在反序列化bean之后调用context.getAutowireCapableBeanFactory().configureBean(bean, name)
来实现它 - 但这很糟糕,因为bean的初始化程序再次被调用。 (至于同一范围内的其他依赖项,不是瞬态的,并且是反序列化的,我甚至不确定它们为什么不被configureBean
覆盖,但我不认为它们是。)
什么更好?我应该只获取bean定义,循环遍历它,找到作用于请求的依赖项,然后在上下文中调用getBean(name)
吗?
(顺便说一句,我不确定它有什么不同,但我们使用的是奇怪的Spring。我们为每个非回发的HTTP请求实例化一个新的ClassPathXmlApplicationContext,而不是单个WebApplicationContext。回发,我们反序列化bean。所以当我说“作用于请求”时,我在撒谎;这些bean实际上是单例范围的。我想使用WebApplicationContext和更合理的范围,但到目前为止正如我所知,这与我们目前的问题正交。)
答案 0 :(得分:0)
它有所不同 - 我一直在使用带有JSF的spring很长一段时间并且没有任何序列化问题。要做的就是在faces-config.xml
中定义以下内容:
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
通过向JSF页面提供spring bean(使用request
和session
spring范围),将spring与JSF集成。
所以,我建议大幅改变你的方法,这样你就不会在将来遇到这类问题。