在这里,我们在Google Apps引擎中有一个基于Spring的webapp。

我创建了一个UserDetailService类,以从GAE数据存储区加载UserDetails(假设这是最好的方法)。

@Service("springUserDetailsService")
public class SpringUserDetailsService implements UserDetailsService {

    @Resource(name="userDao")
    private IUserDao userDao;
    //...


但是,当GAE尝试将会话持久保存到数据存储区时,将引发以下异常(显然)。

java.lang.RuntimeException: java.io.NotSerializableException: com.prepayproxy.servicelayer.SpringUserDetailsService
    at com.google.apphosting.runtime.jetty.SessionManager.serialize(SessionManager.java:387)
    at com.google.apphosting.runtime.jetty.SessionManager.createEntityForSession(SessionManager.java:364)


我首先想到要序列化SprintUserDetailsService对象,但是它引用了我的UserDao,而该引用又引用了数据源对象,大约在那时,我吓坏了,决定看看是否有更好的方法。

最佳答案

关于第二点,我仅假设spring security在会话中存储对UserDetailsS​​ervice的引用,这是如何将其与会话的GAE序列化联系在一起的。就我所知,一切都是我无法控制的,除非我错过了什么。


SpringSecurity没有理由在会话中引用应用程序的UserDetailsS​​tore。 UserDetailsS​​tore在概念上不是会话范围的。

如果会话管理器试图序列化UserDetailsS​​ervice,则可能是在其他会话范围对象中对UserDetailsS​​ervice进行引用的结果。

07-24 12:58