Spring3反序列化 - 单例注入

时间:2012-01-24 15:29:26

标签: spring jsf

我正在使用JSF2和Spring3开发Web应用程序,并且在反序列化方面存在问题。

我有一些会话范围的bean定义如下:

@Controller(value = "admin")
@Scope(value = "session")
public class AdminBean implements Serializable {
...

我也有一些像这样定义的单身人士:

@Repository
public class Repo {

单身人士会像这样注入会话bean

@Resource
private transient Repo repo;

我添加transient后,我的序列化/反序列化问题就消失了。但现在我遇到的问题是,在反序列化后,依赖项(在这种情况下为repo)为空。我在这个问题上搜索了很多,并找到了一些解决方法,但我仍然想知道这个问题的最佳解决方案是什么?

在我看来,在会话bean中使用应用程序范围的bean是一种非常常见的情况,对此没有一个干净的解决方案吗?我带来了@Configurable的解决方案,但是我真的需要一些加载时间编织的东西吗?注射的目标已经由弹簧管理,所以对我来说没有意义.. 请加油我

2年后

更新:您可以透明地将会话范围的bean注入应用程序范围的bean(尽管在大多数情况下可能不是一个好主意)。我只需要相应地在@Scope上设置proxyMode。

2 个答案:

答案 0 :(得分:1)

尝试通过AutowireCapableBeanFactory获取applicationContext.getAutowireCapableBeanFactory(),并且有一些方法,例如autowireBeanPropertiesautowireBeanconfigureBean应该能够在反序列化后重新配置您的禁令。选择一种最适合您的方法(其中一种触发后期处理,另一种不触发等)。

第二个想法是将Repo包装在可序列化的代理中。它将使用AdminBean序列化并反序列化。此代理应该保持“真实”状态。瞬态引用,如果在反序列化后它变为null,它应该从应用程序上下文中查找它。

我听说Spring 3自动包装有这样一个代理的bean,但我从来没有设法让它工作。

答案 1 :(得分:0)

我使用JSF的@ViewScoped遇到了类似的问题,其中支持bean必须可序列化,这反过来又希望所有依赖项都可序列化,在所有情况下都无法获得所有依赖项。正如@Peter提到的关于Spring 3的链接@ stackoverflow讨论相同的here。我将transient用于某些依赖项(Spring),对于反序列化过程,我将bean挂钩到

private void writeObject(java.io.ObjectOutputStream stream) and private void readObject(java.io.ObjectInputStream stream)

在视图中使用scoped bean并调整它们以获得适当的引用。