- стандартный случай - у вас есть контроллер (
@Controller
) с@Scope("session")
. - классы, помещенные в сеанс, как правило, должны реализовывать
Serializable
, чтобы они могли быть физически сохранены в случае перезапуска сервера, например - Если контроллер реализует
Serializable
, это означает, что все службы (другие spring beans), которые он ссылается, также будут сериализованы. Они часто являются прокси-серверами, со ссылками на операторов транзакций, фабрики менеджеров объектов и т.д. - Маловероятно, что какая-либо служба или даже контроллер имеют ссылку на
ApplicationContext
, реализуяApplicationContextAware
, поэтому это может эффективно означать, что весь контекст сериализуется. И учитывая, что он содержит множество соединений, то есть вещи, которые не могут быть сериализованы по идее, он будет восстановлен в коррумпированном состоянии.
До сих пор я в основном игнорировал эти проблемы. Недавно я подумал о объявлении всех моих зависимостей spring transient
и возвращении их в readResolve()
статическими классами утилиты WebApplicationContextUtils
и таких, которые содержат запрос /ServletContext в ThreadLocal
. Это утомительно, но гарантирует, что когда объект будет десериализован, его зависимости будут "обновлены" с текущим контекстом приложения.
Есть ли принятая практика для этого или какие-либо рекомендации по сериализации частей контекста spring.
Обратите внимание, что в JSF управляемые beans (~ контроллеры) имеют состояние (в отличие от основанных на действии веб-фреймворков). Поэтому, возможно, мой вопрос стоит больше для JSF, чем для spring -mvc.