如果我在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
来解决它。但是,我不理解这个推理。为什么只有视图范围而不是其他范围才会出现此异常?
答案 0 :(得分:6)
您没有从web.xml提供设置,但如果javax.faces.STATE_SAVING_METHOD
设置为client
,则视图始终是序列化的,因此NotSerializableException
将始终发生。
你应该总是让你的JSF bean可序列化,因为应用服务器可能想要序列化会话,所以所有会话范围和视图范围的bean,即使状态保存设置为server
。
但是如果服务器没有序列化你的会话,你就不会在会话范围的bean上得到那个错误。但是如果在客户端上序列化视图,则意味着所有视图范围的bean都被序列化为字符串,该字符串作为隐藏字段发送,包含所有请求,并且JSF引擎检测到您的bean不可序列化。
NotSerializableException
仅在服务器尝试实际序列化bean时发生!
答案 1 :(得分:1)
您必须在您的bean中实现序列化
public MyJSFBean implements Serializable{
//Bean coding
}
在@ViewScoped bean中,它是必需的,因为屏幕数据对于视图有效,而不仅仅是一个请求。在@SessionScoped的情况下,bean数据存储在负责数据序列化的会话中