Как вы вводите зависимости, помеченные как @Configurable после десериализации Tomcat из SESSIONS.ser? - PullRequest
1 голос
/ 29 января 2011

Примечание: это не имеет никакого смысла, если вы не очень хорошо знакомы с Java, Spring AOP и Tomcat.

Проблема в том, что компоненты, помеченные @Configurable, не вводятся при десериализации Tomcat SESSIONS.ser.

Я заметил такое поведение в устаревшем приложении на базе Struts 1.2.9 с Spring 2.5.4, spring-tomcat-weaver-2.5.4, Tomcat 6.0.14.

Код:

public class MyForm implements Serializable {
   private Foo myFoo; // getters and setters
}

public class Foo imlements Serializable {
   private Bar myBar; // getters setters
}

@Configurable("barTemplate")
public class Bar implements Serializable {
   @Autowired(required=true)
   private transient SessionFactory hello;
   // other transient dependencies ...
}

XML конфигурирует Bar как прототип bean.

Правильный контекст: настроенный пружиной и контекст: применяются параметры загрузки-ткача и т. Д. (Поскольку он работает при холодном запуске Tomcat).

Все работает нормально при первом запуске. Однако перезапуск Tomcat приводит к записи SESSIONS.ser, а после перезагрузки десериализует MyForm, что и происходит. Однако ни одна из зависимостей в Bar не установлена!

Но если я выключу Tomcat, удалю файл SESSIONS.ser и перезагрузлю, тогда все будет работать.

Weird.

Любой совет с благодарностью.

1 Ответ

1 голос
/ 30 января 2011

Я пропущу весеннюю часть, так как не делаю этого. Однако я должен признать, что я также ожидал бы, что Spring достаточно умен, чтобы повторно вводить их после десериализации ( edit: это казалось fixed в Spring 2.5.2?).

Одним из обходных путей будет отключение сериализации сеанса во время выключения / запуска Tomcat. Таким образом, вы начнете с новой новой сессии, и все будет только что построено и введено. Однако недостатком является то, что конечные пользователи будут терять свои данные сеанса при каждом перезапуске Tomcat.

Для этого добавьте элемент <Manager> с пустым pathname к элементу <Context> рассматриваемого веб-приложения.

<Context ...>
    <Manager pathname="" />
</Context>

Это в основном указывает Tomcat на использование no диспетчера сеансов вообще.

...