如果我使用 @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
来解决它.但是,我不明白其中的道理。为什么这个异常只发生在 View 范围而不是其他范围?
最佳答案
您没有提供 web.xml 中的设置,但是如果 javax.faces.STATE_SAVING_METHOD
设置为 client
, View 总是序列化的,所以 NotSerializableException
总会发生。
您应该始终使您的 JSF bean 可序列化,因为应用服务器 5 月 想要序列化 session ,所以所有 session 范围和 View 范围的 bean,即使状态保存设置为 server
.
但是如果服务器没有序列化你的 session ,你就不会在 session 范围的 bean 上得到那个错误。但是如果 View 在客户端被序列化,这意味着所有 View 范围的 bean 都被序列化为字符串,该字符串作为隐藏字段与所有请求一起发送,并且 JSF 引擎检测到您的 bean 不可序列化。NotSerializableException
仅当服务器尝试实际序列化您的 bean 时才会发生!
关于jsf - 使用 @ViewScoped 时的 java.io.NotSerializableException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18996151/