反序列化会话豆@Inject依赖关系
问题描述:
@Component
@Scope("session")
public class UserBean implements Serializable {
private Long userId;
@Inject
private UserDAO userDAO;
....
}
我试图反序列化这个对象,但我遇到:反序列化会话豆@Inject依赖关系
2017-11-11 10:09:10.470 WARN o.a.c.c.C.[Catalina].[localhost].[/] - Cannot deserialize session attribute userBean for session 8757DE617838F4D78
5E86BDBFFFB18A6
2017-11-11 10:09:10.505 ERROR o.a.catalina.session.StandardManager - Exception loading sessions from persistent storage
java.lang.ClassCastException: java.lang.String cannot be cast to java.io.ObjectStreamClass
我的印象是,Spring将处理上反序列化userDAO的,这应该不工作任何修改?
答
不知道是否有更好的方法,但这是工作。
@Component
@Scope("session")
public class UserBean implements Serializable, HttpSessionActivationListener {
private Long userId;
@Inject
private transient UserDAO userDAO;
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDidActivate(HttpSessionEvent e) {
ServletContext sc = e.getSession().getServletContext();
WebApplicationContext context = WebApplicationContextUtils
.getRequiredWebApplicationContext(sc);
context.getAutowireCapableBeanFactory().autowireBean(this);
}
}
答
这是不够的,以纪念UserBean
作为Serializable
。你应该确保它的所有依赖关系(字段)和依赖关系也是Serializable
。当Java序列化对象时,它确实将对象的图形串联起来。
由于UserDAO
或其依赖关系(字段)不可序列化,因此很有可能失败。标记为Serializable
,它应该工作。
希望它有帮助!
因为不会有任何'userDAO',所以我会期待反序列化的问题。 –
@DanyloZatorsky你是什么意思... UserDAO是在sessionDidActivate方法中自动装配的。 –