无法反序列化Spring Session Scoped bean

时间:2016-05-13 14:34:35

标签: java spring spring-mvc session

我有以下会话作用域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被正确序列化?

更新:有一个issue对此问题进行了解决,标记为已解决但没有评论,但我仍然面对此问题。

3 个答案:

答案 0 :(得分:1)

请试一试:

使用:import org.springframework.test.util.AopTestUtils;

 Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance);
在序列化之前

注意:此代码有助于解决问题,如果这项工作,您必须分析项目架构和依赖,以更好地完成生产代码。首先,为什么需要序列化ScopedProxyMode.TARGET_CLASS

答案 1 :(得分:0)

拥有范围会话的bean并不意味着bean可以序列化并且可以存储在会话中。

从类的名称可以猜到,代理类在运行时生成,每次启动时都有不同的名称。这解释了为什么在反序列化时出现问题。

我猜您尝试将此SessionData添加为Web会话的属性。你不应该。将您的POJO数据存储在Web会话中,而不使用bean。

如果您使用bean注入数据库连接或类似对象,请忘记它。您可以将会话范围bean用于特定的上下文,而这些上下文不符合我的要求。

答案 2 :(得分:0)

我不太了解你的任务,但在我看来,像这样的数据对象不应该是一个spring bean,因为spring bean应该是业务逻辑bean,控制器bean等等而不是session dto。

由于这个原因,我认为你应该试着想一想为什么要存储你的spring bean的数据,并尝试从shoud的业务逻辑bean中在http会话中@sessionattribute of springmvc中删除你想要的数据。也不是会议意识。

我认为这可以帮助您更改实施状态,以便找到问题的解决方案