5

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

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

4

2 回答 2

6

您没有提供来自 web.xml 的设置,但如果javax.faces.STATE_SAVING_METHOD设置为client,则视图总是被序列化,所以NotSerializableException总是会发生。

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

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

NotSerializableException仅当服务器尝试实际序列化您的 bean 时才会发生!

于 2013-09-25T08:09:56.103 回答
1

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

public MyJSFBean implements Serializable{
//Bean coding
}

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

于 2013-09-25T07:07:51.207 回答