反序列化具有@Inject依赖项的会话 bean


@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);
    }
}

最新更新