无法反序列化Spring会话作用域Bean。

16

我有以下会话作用域的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,标记为已解决但没有评论,但我仍然面临此问题。

你如何将会话数据存储在数据库中? - Steffen Harbich
我已经配置了Tomcat服务器,将会话存储在数据库中。 - vtor
困惑:@ManagedBean 是 JSF 的注解,为什么一个 bean 上会有 JSF 和 Spring 的注解? - 9ilsdx 9rvj 0lo
3个回答

1

请尝试一下:

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

 Serializable readyToSerialize = AopTestUtils.getUltimateTargetObject(yourInstance);

在序列化之前。

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


0

我不太清楚你的任务,但在我看来,像这样的数据对象不应该成为Spring Bean,因为Spring Bean应该是业务逻辑Bean、控制器Bean等,而不是会话DTO。

出于这个原因,我认为你应该思考为什么要存储Spring Bean的数据,并尝试将你想要在HTTP会话中存储的数据与Spring MVC的@SessionAttribute分离开来,从业务逻辑Bean中解耦出来,使其不再与会话相关。

希望这能帮助你改变实现策略,找到解决问题的方法。


0

拥有一个作用域为session的bean并不意味着该bean是可序列化的,也不能将其存储在会话中。

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

我猜你试图将SessionData作为Web会话的属性添加。你不应该这样做。在不使用bean的情况下将POJO数据存储在Web会话中。

如果您使用bean来注入数据库连接或类似对象,请忘记它。我猜您可以只使用会话范围的bean来处理特定上下文,但这可能无法满足您的要求。


2
这是JSF bean,JSF会自动序列化所有Session作用域的bean并将它们存储在会话中。 - vtor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接