Мне интересно, почему нет единого уведомления о важности свойства неизменяемости при хранении сериализуемых объектов в сеансе HTTP? Я попытался проверить спецификации API JSF и Servlet, но не смог найти ничего связанного.
Я видел специфическую проблему c в случае кластерного приложения на основе JSF, где управляемый компонент @SessionScoped
является изменяемым т.е. измененный пользователем параметр сохраняется как поле этого управляемого компонента.
Проблема начинается, когда узел, «владеющий» сеансом (благодаря требованию липкости в спецификациях API сервлета), умирает, а другой узел начинает обслуживать сеанс, последнее состояние теряется. На самом деле, только начальное состояние реплицируется. Я полагаю, что это потому, что управляемые bean-компоненты помещаются в сеанс (и реплицируются на резервные узлы) только при первом их создании, по крайней мере это подтверждается моими тестами, выполненными на Websphere.
В то время как можно спорить, является ли это хорошим дизайном или нет, JSF и даже Servlet API все еще позволяют этому случиться.
Я также нашел некоторые примечания в Oracle документах :
Как правило, все атрибуты сеанса должны рассматриваться как неизменяемые объекты, если это возможно. Это гарантирует, что разработчики осознают, когда они меняют атрибуты. В случае изменяемых объектов изменение атрибутов часто требует двух шагов: изменение состояния объекта атрибута, а затем обновление сеанса вручную с помощью измененного объекта атрибута путем вызова javax.servlet.http.HttpSession.setAttribute () . Это означает, что ваше приложение должно всегда вызывать setAttribute () , если значение атрибута было изменено, в противном случае измененное значение атрибута не будет реплицироваться на сервер резервного копирования.
Помимо ручного обновления атрибута, как описано выше, есть ли какое-нибудь чистое решение, желательно идиоматическим образом c JSF?