Не удалось десериализовать Spring Сессионный охват bean
У меня есть следующий сеансовый охват bean:
@ManagedBean
@Component
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS, value="session")
public class SessionData implements Serializable {}
и я храню сессии tomcat в базе данных. Проблема в том, что когда приложение пытается десериализовать сохраненный сеанс, я получаю следующую ошибку:
org.apache.catalina.session.PersistentManagerBase.swapIn Error deserializing Session EE913D2ACAD49EB55EDA657A54DFA2CB: {1}
java.lang.ClassNotFoundException: de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9
Кажется, что он сериализует фактически весь контекст Spring, и, очевидно, нет такого класса de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9
после перезагрузки сервера, поэтому я получаю вышеупомянутое исключение.
Есть ли способ избежать этого, так что область bean с сессионным сеансом сериализована правильно?
UPDATE: существует вопрос, который относится к этому, который помечен как разрешенный без комментариев, однако я все еще сталкиваюсь с этим.
Ответы
Ответ 1
Пожалуйста, попробуйте:
используя: import org.springframework.test.util.AopTestUtils;
Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance);
перед его сериализацией.
Примечание: этот код полезен для понимания проблемы, если в этой работе вам необходимо проанализировать архитектуру проекта и его зависимости, лучше выполнить производственный код. Прежде всего, зачем вам сериализовать ScopedProxyMode.TARGET_CLASS
Ответ 2
Наличие bean с сеансом видимости не означает, что bean является сериализуемым и что он может быть сохранен в сеансе.
Как вы можете догадаться из названия класса, при каждом запуске создается прокси-класс во время выполнения с другим именем. Это объясняет, почему возникает проблема при десериализации.
Я думаю, вы пытаетесь добавить этот SessionData в качестве атрибута веб-сессии. Тебе не следует. Храните данные POJO в веб-сеансе без использования beans.
Если вы используете bean для ввода подключений базы данных или похожих объектов, забудьте об этом. Вы можете просто использовать область сеанса beans для конкретных контекстов, которые не соответствуют вашим требованиям, я думаю.
Ответ 3
Я не очень хорошо знаю вашу задачу, но, на мой взгляд, такой объект данных не должен быть spring bean, потому что spring bean должна быть бизнес-логикой bean, контроллером bean и т.д., а не сеанс dto.
по этой причине я считаю, что вы должны попытаться подумать, почему вы хотите хранить данные своего spring bean, и попытаться декомпилировать данные, которые вы хотите в http-сессии, @sessionattribute из springmvc, из бизнеса логический bean, который не будет информирован о сеансе.
i hooe, что это может помочь вам изменить стратегию реализации, чтобы найти решение вашей проблемы.