Атрибут Java HttpSession setattribute генерирует несериализуемое исключение на qa, но не в локальной среде - PullRequest
1 голос
/ 11 августа 2010

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

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

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

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

EDIT:

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

1 Ответ

8 голосов
/ 11 августа 2010

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

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

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

...