我有以下会话作用域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对此问题进行了解决,标记为已解决但没有评论,但我仍然面对此问题。
答案 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中删除你想要的数据。也不是会议意识。
我认为这可以帮助您更改实施状态,以便找到问题的解决方案