【问题标题】:Deserialized bean needs scoped dependencies反序列化 bean 需要范围依赖
【发布时间】:2011-01-21 03:52:20
【问题描述】:

如何将依赖项注入到反序列化的 bean 中?

我的一些 Spring bean 应该在我们的 JSF 应用程序的呈现响应阶段进行序列化,然后在下一个请求开始时进行反序列化。其中一些 bean 具有范围为请求的依赖项。如果我使用作用域代理 ("<aop:scoped-proxy>") 配置依赖项,我无法序列化我的依赖 bean - 代理不可序列化。

所以现在我们通过将序列化 bean 类的适当成员变量声明为瞬态来做到这一点,然后在反序列化 bean 之后调用 context.getAutowireCapableBeanFactory().configureBean(bean, name) ——但这很糟糕,因为再次调用了 bean 的初始化程序。 (至于其他在同一范围内,不是瞬态的,并且是反序列化的,我什至不确定为什么它们不会被configureBean 覆盖,但我不认为它们是。)

什么更好?我是否应该只获取 bean 定义,循环遍历它,找到请求范围内的依赖项,然后在上下文中调用 getBean(name)

(顺便说一句,我不确定这会有所不同,但我们使用 Spring 有点奇怪。我们为每个非回发 HTTP 请求实例化一个新的 ClassPathXmlApplicationContext,而不是单个 WebApplicationContext。根据回发,我们反序列化 bean。所以当我说“范围为请求”时,我在撒谎;这些 bean 实际上是单例范围的。我想使用 WebApplicationContext 和更理智的范围,但到目前为止据我所知,这与我们目前的问题是正交的。)

【问题讨论】:

  • 为每个(一些)请求实例化一个新的上下文不可能是正确的方法......你序列化什么样的bean?他们的目的是什么?我怀疑有一个更好的设计解决方案可以消除你现在面临的问题(如果你保持现状,其他人会得到钱)
  • 这似乎是错误的方法 - 同意。它是在我们将使用 Spring 的应用程序集成到我们的系统中时创建的。但是这种集成似乎很糟糕。
  • 最后我在同一个问题上发布了另一个问题;最终我自己写了一个解决方案,并作为答案发布:stackoverflow.com/questions/3471835/…

标签: java spring serialization jsf dependency-injection


【解决方案1】:

一切都不同了——我在 JSF 中使用 spring 已经很长时间了,并且没有遇到任何序列化问题。要走的路只需在您的faces-config.xml 中定义以下内容:

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

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

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

【讨论】:

  • 我倾向于放弃我们所拥有的疯狂方法,并尝试一些更正统的东西,就像你描述的那样。
  • 文档在哪里说 Spring 会自动重新注入瞬态 @Autowired/@Injected 对反序列化时间的依赖?我的意思是,我得到的图像是它只允许从 EL 调用 Spring bean?
猜你喜欢
  • 2014-05-17
  • 2018-04-24
  • 2011-04-16
  • 2016-08-12
  • 2013-02-26
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多