java Spring UserDetails服务在googleappsengine中不是可序列化的会话属性
这里我们在谷歌应用程序引擎中有一个基于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
,而我的UserDao
又引用了数据源对象,大约在那时,我吓了一跳,决定看看是否有更好的方法
# 1 楼答案
SpringSecurity没有理由将对应用程序的UserDetailsStore的引用放入会话中。UserDetailsStore在概念上不是会话作用域
如果会话管理器试图序列化UserDetailsService,则可能是由于在其他会话作用域对象中引用了UserDetailsService
# 2 楼答案
两种选择:
不要担心
DataSource
-spring,因为版本3提供了一个代理,当反序列化时,它将获得一个新的数据源,而不是原始的(不相关的)不要将您的服务放在会话中。可能它被会话范围内的某个对象引用,所以在会话范围内使其不稳定
另见this question