使用@ViewScoped时的java.io.NotSerializableException

时间:2013-09-25 04:18:16

标签: jsf jsf-2 view-scope notserializableexception

如果我在JSF中使用@ViewScoped,则会发生以下异常:

java.io.NotSerializableException: com.solv.basics.Basics
    java.io.ObjectOutputStream.writeObject0(Unknown Source)
    java.io.ObjectOutputStream.writeObject(Unknown Source)
    java.util.HashMap.writeObject(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
    java.io.ObjectOutputStream.writeSerialData(Unknown Source)
    java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)

我可以通过让bean实现Serializable来解决它。但是,我不理解这个推理。为什么只有视图范围而不是其他范围才会出现此异常?

2 个答案:

答案 0 :(得分:6)

您没有从web.xml提供设置,但如果javax.faces.STATE_SAVING_METHOD设置为client,则视图始终是序列化的,因此NotSerializableException将始终发生。

应该总是让你的JSF bean可序列化,因为应用服务器可能想要序列化会话,所以所有会话范围和视图范围的bean,即使状态保存设置为server

但是如果服务器没有序列化你的会话,你就不会在会话范围的bean上得到那个错误。但是如果在客户端上序列化视图,则意味着所有视图范围的bean都被序列化为字符串,该字符串作为隐藏字段发送,包含所有请求,并且JSF引擎检测到您的bean不可序列化。

NotSerializableException仅在服务器尝试实际序列化bean时发生!

答案 1 :(得分:1)

您必须在您的bean中实现序列化

public MyJSFBean implements Serializable{
//Bean coding
}

在@ViewScoped bean中,它是必需的,因为屏幕数据对于视图有效,而不仅仅是一个请求。在@SessionScoped的情况下,bean数据存储在负责数据序列化的会话中