Должно ли PARTIAL_STATE_SAVING установить значение false?

Кажется, что сегодня (апрель 2012 г.) реализация MyFaces и Mojarra JSF 2.1 имеет дефекты при частичном сохранении состояния и что PARTIAL_STATE_SAVING должен быть установлен в false.

Это правда?

Ответ 1

Должно ли PARTIAL_STATE_SAVING установить значение false?

Только, когда вы сталкиваетесь с общим дефектом, связанным с частичным сохранением состояния в вашем веб-приложении, который действительно не может быть разрешен/искажен другим способом. Частичное сохранение состояния имеет важнейшие преимущества в отношении общей производительности и использования памяти. См. Также Почему JSF сохраняет состояние компонентов пользовательского интерфейса на сервере?

Я не могу на 100% надежно говорить для MyFaces, но в Mojarra основная причина проблем с частичным сохранением состояния проявится, когда вы привязываете какой-либо атрибут обработчика тега (обработчики тегов распознаются из-за отсутствия rendered в теге, таком как теги JSTL), в область с видимым охватом bean или когда вы привязываете атрибут id или binding компонента JSF к области с видимым охватом bean (эти атрибуты являются именно разрешено во время создания/восстановления представления).

Эта проблема вызвана проблемой куриного яйца, описанной в вопрос № 1492 JSF и Спецификация спецификации JSF 787: при включенном режиме с частичным сохранением состояния область видимости beans хранилась в состоянии частичного просмотра. Таким образом, чтобы извлечь область видимости beans, необходимо восстановить состояние частичного просмотра. Во время восстановления (построения) представления, EL во всех вышеперечисленных атрибутах будет оцениваться. Однако, поскольку в данный момент нет экземпляра с ограниченным охватом bean экземпляра, будет создан совершенно новый экземпляр. Тем не менее, все свойства будут установлены по умолчанию! После восстановления представления и получения исходного вида beans назад они будут возвращены в область видимости, переопределяя (временные) экземпляры, созданные во время восстановления представления. Но EL-выражения этих атрибутов уже были оценены на основе совершенно другого экземпляра и не могут быть восстановлены.

Эта проблема с куриным яйцом решена с тех пор, как Mojarra 2.1.18 и 2.2.0, сохраняя область видимости beans в сеансе. Если по какой-то причине вы не можете обновить, то это действительно можно решить, отключив сохранение частичного состояния, установив javax.faces.PARTIAL_STATE_SAVING в false. Альтернативой является просто не связать вышеупомянутые атрибуты с областью видимости bean вообще, но искать альтернативное решение.

Вы также можете установить javax.faces.FULL_STATE_SAVING_VIEW_IDS. Это позволяет указать список разделенных запятыми всех идентификаторов вида, для которых необходимо отключить частичное сохранение состояния:

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/some.xhtml,/other.xhtml</param-value>
</context-param>

Это позволяет вам максимально эффективно использовать частичное сохранение состояния и отключать его только для подмножества представлений, на которых проблемы с сохранением частичного состояния могут быть действительно не исправлены.

См. также: