java.io.NotSerializableException при использовании @ViewScoped
Если я использую @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)
Я могу решить это, позволив бобу реализовать Serializable
, Тем не менее, я не понимаю аргументацию. Почему это исключение возникает только для области просмотра, а не для других областей?
2 ответа
Вы не предоставили настройки из web.xml, но если javax.faces.STATE_SAVING_METHOD
установлен в client
, представление всегда сериализуется, поэтому NotSerializableException
всегда будет происходить.
Вы должны всегда делать сериализуемые ваши bean-компоненты JSF, потому что сервер приложений может захотеть сериализовать сеанс, поэтому все bean-объекты в области сеанса и в области просмотра, даже если для сохранения состояния задано значение server
,
Но если сервер не сериализует ваш сеанс, вы не получите эту ошибку на bean-объектах сессионной области. Но если представление сериализуется на клиенте, это означает, что все bean-объекты области видимости сериализуются в строку, которая отправляется как скрытое поле со всеми запросами, и механизм JSF обнаруживает, что ваши bean-компоненты не сериализуемы.
NotSerializableException
происходит только тогда, когда сервер пытается на самом деле сериализовать ваши бины!
Вы должны реализовать сериализацию в вашем бобе
public MyJSFBean implements Serializable{
//Bean coding
}
В бине @ViewScoped это требуется, потому что данные экрана действительны для просмотра не только для одного запроса. В случае @SessionScoped данные бина хранятся в сеансе, который заботится о сериализации данных