我正在使用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。
答案 0 :(得分:1)
尝试通过AutowireCapableBeanFactory
获取applicationContext.getAutowireCapableBeanFactory()
,并且有一些方法,例如autowireBeanProperties
,autowireBean
和configureBean
应该能够在反序列化后重新配置您的禁令。选择一种最适合您的方法(其中一种触发后期处理,另一种不触发等)。
第二个想法是将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并调整它们以获得适当的引用。