java.io.NotSerializableException 当使用 @ViewScoped 时



如果我在 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)

我可以通过让豆子实现Serializable来解决它。但是,我不明白其中的推理。为什么此异常只发生在视图范围而不是其他范围?

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

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

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

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

你必须在 bean 中实现序列化

public MyJSFBean implements Serializable{
//Bean coding
}

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

相关内容

  • 没有找到相关文章

最新更新