java - 反序列化 bean 需要范围依赖

标签 java spring serialization jsf dependency-injection

如何将依赖项注入(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(使用 requestsession spring 作用域)将 spring 与 JSF 集成。

因此,我建议彻底改变您的方法,这样您将来就不会遇到此类问题。

关于java - 反序列化 bean 需要范围依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2336771/

相关文章:

Java Spring RequestParam 为 null

java - spring 4 mvc app - 应用程序级异常处理程序

serialization - 为什么 WebAPI 不以 XML 形式返回我的 POCO?

c# - 在 c# 的 xml 序列化中是否有跳过空数组的属性?

powershell - PowerShell 是否支持 HashTable 序列化?

java - java中BlockingQueue/ArrayBlockingQueue的序列化

java - 为什么我不能更改 JButton 的颜色?

java - Java中的Yarn和MapReduce帮助

java - 有什么方法可以使用 JAXB 为集合指定 defaultValue 吗?

java - 如何使用 spring-boot-starter-data 将 cassandra 与 postgres 一起使用