@Component
@Scope("session")
public class UserBean implements Serializable {
private Long userId;
@Inject
private UserDAO userDAO;
....
}
我正在尝试反序列化此对象,但遇到:
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 会在反序列化时处理用户 DAO,这应该无需任何修改即可工作?
仅将UserBean
标记为Serializable
是不够的。您应该确保其所有依赖项(字段(和这些依赖项的依赖项也Serializable
。当Java序列化对象时,它确实序列化了对象的图。
它很可能失败,因为UserDAO
或其依赖项(字段(不可序列化。将它们标记为Serializable
,它应该可以工作。
希望对您有所帮助!
不确定是否有更好的方法,但这可以完成工作。
@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);
}
}