【问题标题】:java.io.NotSerializableException when @ViewScoped is used使用 @ViewScoped 时出现 java.io.NotSerializableException
【发布时间】:2013-09-30 12:39:38
【问题描述】:

如果我在 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 来解决它。但是,我不明白其中的道理。为什么这个异常只发生在视图范围而不是其他范围?

【问题讨论】:

    标签: jsf jsf-2 view-scope notserializableexception


    【解决方案1】:

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

    public MyJSFBean implements Serializable{
    //Bean coding
    }
    

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

    【讨论】:

    • 已经提供了两个相同的答案。
    【解决方案2】:

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

    应该始终使您的 JSF bean 可序列化,因为应用程序服务器可能想要序列化会话,因此所有会话范围和视图范围的 bean,即使状态保存设置为server

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

    NotSerializableException 仅在服务器尝试实际序列化您的 bean 时出现!

    【讨论】:

    • 实际上还有一个原因,正是这个原因使 MyFaces 与 Mojarra 有所不同。如果您发现了这一点,您将获得一票。
    • @BalusC:是浅拷贝和深拷贝的概念吗,区别在于 Mojarra 不会序列化会话中的状态,而 JSF 仅存储指向会话中特定状态的指针。
    • @Shirgill:你已经问过这个问题了 :) stackoverflow.com/q/36574976
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 2013-09-18
    • 2011-12-07
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多