Должно ли 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 и проблеме 787 спецификации JSF: при включенном частичном сохранении состояния bean-объекты области видимости были сохранены в состоянии частичного просмотра. Таким образом, для извлечения bean-компонентов вида необходимо восстановить состояние частичного представления. Во время восстановления (построения) представления будет проверяться EL во всех вышеупомянутых атрибутах. Однако, поскольку в данный момент нет доступного экземпляра bean-объекта в области видимости, будет создан новый экземпляр. Это будет иметь все свойства по умолчанию! После восстановления представления и получения исходных объектов видимости bean-компоненты возвращаются в область видимости, переопределяя (временные) экземпляры, созданные во время восстановления представления. Но выражения EL этих атрибутов уже были оценены на основе совершенно другого экземпляра и не могут быть восстановлены.

Эта проблема с куриным яйцом решена начиная с Mojarra 2.1.18 и 2.2.0 путем хранения в сессии бобов видимости. Если по какой-то причине вы не можете выполнить обновление, это действительно можно решить, отключив частичное сохранение состояния, установив 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>

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

Смотрите также:

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