2013-09-25 4 views
5

Если я использую @ViewScoped в JSF, то происходит следующее исключение:java.io.NotSerializableException когда @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) 

я могу решить эту проблему, позволяя боб реализовать Serializable. Однако я не понимаю рассуждений. Почему это исключение возникает только для области просмотра, а не для других областей?

ответ

6

Вы не предоставили настройки из web.xml, но если javax.faces.STATE_SAVING_METHOD установлен в client, вид всегда сериализации, поэтому всегда будет NotSerializableException.

Вы должны всегда сделать ваши JSF бобов сериализации, потому что сервер приложений может хочет сериализовать сессию, так что все в контексте сеанс и просматривать в области видимости бобы, даже если сохранение состояния устанавливаются в server.

Но если сервер не сериализует вашу сессию, вы не получите эту ошибку в бодах с сессией. Но если просмотр сериализуется на клиенте, это означает, что все объекты с видимым охватом сериализуются в строку, которая отправляется как скрытое поле со всеми запросами, а механизм JSF обнаруживает, что ваши компоненты не являются сериализуемыми.

NotSerializableException происходит только тогда, когда сервер пытается фактически сериализовать ваши бобы!

+3

Есть еще одна причина, и именно это делает MyFaces несколько отличным от Mojarra. Если вы это узнаете, вы получите голосование. – BalusC

+0

@BalusC: Это понятие мелкой и глубокой копии, разница заключается в том, что Mojarra не сериализует состояние в сеансе, когда JSF сохраняет только указатели на это конкретное состояние в сеансе. –

+0

@Shirgill: об этом вы уже спрашивали :) http://stackoverflow.com/q/36574976 – BalusC

1

Вы должны реализовать сериализацию в вас боб

public MyJSFBean implements Serializable{ 
//Bean coding 
} 

В @ViewScoped боба требуется, поскольку данные экрана действительны для просмотра не только для одного запроса. В случае данных @SessionScoped боба хранится в сессии, которая заботится о сериализации данных

+0

Два одинаковых ответа были предоставлены. –

Смежные вопросы