反序列化的bean需要作用域依赖项

时间:2010-02-25 19:01:13

标签: java spring serialization jsf dependency-injection

如何将依赖项注入反序列化的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和更合理的范围,但到目前为止正如我所知,这与我们目前的问题正交。)

1 个答案:

答案 0 :(得分:0)

它有所不同 - 我一直在使用带有JSF的spring很长一段时间并且没有任何序列化问题。要做的就是在faces-config.xml中定义以下内容:

<el-resolver>
   org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>

通过向JSF页面提供spring bean(使用requestsession spring范围),将spring与JSF集成。

所以,我建议大幅改变你的方法,这样你就不会在将来遇到这类问题。