使用@ViewScoped时的java.io.NotSerializableException

vij*_*mar 5 jsf jsf-2 view-scope notserializableexception

如果我@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)
Run Code Online (Sandbox Code Playgroud)

我可以通过让bean实现来解决它Serializable.但是,我不理解这个推理.为什么仅对视图范围而不是其他范围发生此异常?

Dan*_*lor 6

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

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

但是,如果服务器没有序列化您的会话,您将不会在会话作用域bean上获得该错误.但是如果view在客户端上被序列化,则意味着所有视图范围的bean都被序列化为字符串,该字符串作为隐藏字段发送,包含所有请求,并且JSF引擎检测到您的bean不可序列化.

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

  • 实际上还有一个原因,就是这个让MyFaces与Mojarra有所不同.如果您发现这一点,您将获得投票. (3认同)