2017-11-11 116 views
0
@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的,这应该不工作任何修改?

回答

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); 
    } 
} 
+0

因为不会有任何'userDAO',所以我会期待反序列化的问题。 –

+0

@DanyloZatorsky你是什么意思... UserDAO是在sessionDidActivate方法中自动装配的。 –

0

这是不够的,以纪念UserBean作为Serializable。你应该确保它的所有依赖关系(字段)和依赖关系也是Serializable。当Java序列化对象时,它确实将对象的图形串联起来。

由于UserDAO或其依赖关系(字段)不可序列化,因此很有可能失败。标记为Serializable,它应该工作。

希望它有帮助!