如果我在 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 数据存储在负责数据序列化的会话中