无法反序列化Spring Session Scoped bean

vto*_*tor 15 java session spring spring-mvc

我有以下会话作用域bean:

@ManagedBean
@Component
@Scope(proxyMode= ScopedProxyMode.TARGET_CLASS, value="session")
public class SessionData implements Serializable {}
Run Code Online (Sandbox Code Playgroud)

我将tomcat会话存储在数据库中.问题是,当应用程序尝试反序列化存储的会话时,我收到以下错误:

 org.apache.catalina.session.PersistentManagerBase.swapIn Error deserializing Session EE913D2ACAD49EB55EDA657A54DFA2CB: {1}
 java.lang.ClassNotFoundException: de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9
Run Code Online (Sandbox Code Playgroud)

它似乎实际上序列化了整个Spring上下文,显然de.myproject.SessionData$$EnhancerBySpringCGLIB$$768b59b9在服务器重启后没有这样的类,所以我收到了上述异常.

有没有办法避免这种情况,以便会话范围的bean正确序列化?

更新:有一个问题关于这个标记为没有评论的解决,但我仍然面对它.

mve*_*era 0

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

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

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

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

  • 这是 JSF bean,JSF 自动序列化所有会话范围的 bean 并将它们存储在会话中。 (2认同)