无法反序列化春季会话作用域 Bean

2022-09-03 08:11:38

我有以下会话范围的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?

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


答案 1

请尝试一下:

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

 Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance);

在序列化之前。

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


答案 2

具有作用域会话的 Bean 并不意味着该 Bean 是可序列化的,并且可以存储在会话中。

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

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

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


推荐