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

时间:2017-11-11 10:13:43

标签: spring deserialization autowired inject

@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,这应该没有任何修改吗?

2 个答案:

答案 0 :(得分:0)

不确定是否有更好的方法,但这可以胜任。

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

答案 1 :(得分:0)

UserBean标记为Serializable是不够的。您应该确保它们的所有依赖项(字段)和依赖项都是Serializable。当java序列化对象时,它确实将对象的图形序列化。

最有可能失败,因为UserDAO或其依赖项(字段)不可序列化。将它们标记为Serializable,它应该可以正常工作。

希望它有所帮助!