在这里,我们在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在会话中存储对UserDetailsService的引用,这是如何将其与会话的GAE序列化联系在一起的。就我所知,一切都是我无法控制的,除非我错过了什么。
SpringSecurity没有理由在会话中引用应用程序的UserDetailsStore。 UserDetailsStore在概念上不是会话范围的。
如果会话管理器试图序列化UserDetailsService,则可能是在其他会话范围对象中对UserDetailsService进行引用的结果。