LogicalViewMap中的非序列化属性

时间:2012-02-29 10:07:17

标签: spring jsf jsf-2 mojarra

我在最近的一个项目中偶然发现了一些序列化问题。 虽然存在一些常见的错误,例如bean在视图范围内而没有实现Serializable但是有一些更复杂的问题,我现在没有答案。

1)当注入的实例不可序列化时,如何处理@ManagedProperty? 在这种情况下,将注入一个以单例Spring bean实现的服务。虽然我可以标记属性transient,但在对托管bean进行反序列化时,这将使属性保留null。另一种相当不明智的方法是省略属性并在需要服务时进行查找(在getService()方法中封装了probabyl)。 虽然使用范围代理的Spring bean有一种方法,但我不确定在不使用Spring时这个问题应该如何解决,或者另一个具有比'Request'更长的范围的非Spring bean是注射。

2)在检查ViewMap期间,我注意到它有时不可序列化,因为默认情况下某些Mojarra内置类不可序列化,例如javax.faces.view.facelets.ConverterHandler。我不明白为什么MojarraViewMap中提出这个问题。

3)在2)中进行观察: 是否有必要使用标准Java序列化方法对ViewMap进行Serializable?根据我的理解,最终在HttpSession中的所有内容都需要序列化,但也许有一些我不知道的Mojarra应用的隐藏序列化技巧。

4)除非设置com.sun.faces.serializeServerState,否则反序列化似乎永远不会发生。 我将private void writeObject(ObjectOutputStream out) throws IOExceptionprivate void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException放在@ViewScoped bean中,以查看序列化是如何发生的。但有趣的是,虽然writeObject  在生命周期完成时调用,readObject永远不会被调用,除非设置了上面提到的context-param。这导致了一个问题,即为什么对象在永远不会被反序列化时被序列化。

使用Mojarra 2.1.6对Tomcat 7.0.11进行了观察。

如果有更多见解的人能够对此有所了解,那就太好了。

THX

0 个答案:

没有答案