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 данные бина хранятся в сеансе, который заботится о сериализации данных

Другие вопросы по тегам