使用@Inject 依赖项反序列化会话 bean

Deserializing sessions beans with @Inject dependencies

@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 会在反序列化时处理 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,它应该可以工作。

希望对您有所帮助!