Java HttpSession setattribute вызывает несериализуемое исключение в qa, но не в локальной среде

Объект, который я сохраняю в сеансе, — это LocalizationContext, который не сериализуем, а мой Tomcat — 5.5.28, а сервер qa — Tomcat 5.5.30. Это из документации Tomcat:

Всякий раз, когда Catalina нормально закрывается и перезапускается, или когда запускается перезагрузка приложения, стандартная реализация Manager попытается сериализовать все текущие активные сеансы в файл на диске, расположенный через атрибут pathname. Все такие сохраненные сеансы затем будут десериализованы и активированы (при условии, что они не истекли за это время), когда перезагрузка приложения будет завершена.

Чтобы успешно восстановить состояние атрибутов сеанса, все такие атрибуты ДОЛЖНЫ реализовывать интерфейс java.io.Serializable. Вы МОЖЕТЕ заставить менеджера применить это ограничение, включив элемент <distributable> в дескриптор развертывания вашего веб-приложения (/WEB-INF/web.xml).

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

ИЗМЕНИТЬ:

Извините, чтобы быть более ясным, мой вопрос двоякий. Должны ли все атрибуты сеанса быть сериализуемыми, и если да, то почему они все еще могут работать в моей локальной среде?


person Community    schedule 11.08.2010    source источник
comment
Я не понимаю. Каков ваш вопрос?   -  person Buhake Sindi    schedule 11.08.2010


Ответы (1)


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

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

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

person Community    schedule 11.08.2010
comment
Что делать, если я не хочу, чтобы сеанс сохранялся при завершении работы контейнера? - person Tristian; 20.01.2011
comment
@Triztian, спецификация сервлета не позволяет этого, и поэтому все атрибуты сеанса должны быть сериализуемыми. Практически вы можете установить атрибуты сеанса для сеанса, если вы можете пометить их как временные. - person Vineet Reynolds; 21.01.2011