有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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又引用了数据源对象,大约在那时,我吓了一跳,决定看看是否有更好的方法


共 (2) 个答案

  1. # 1 楼答案

    两种选择:

    • 不要担心DataSource-spring,因为版本3提供了一个代理,当反序列化时,它将获得一个新的数据源,而不是原始的(不相关的)

    • 不要将您的服务放在会话中。可能它被会话范围内的某个对象引用,所以在会话范围内使其不稳定

    另见this question

  2. # 2 楼答案

    On your second point, I am only assuming that spring security is storing a reference to the UserDetailsService in the session, which is how it gets tied up with the GAE serialization of the session. All beyond my control as far as I see unless I missed something.

    SpringSecurity没有理由将对应用程序的UserDetailsStore的引用放入会话中。UserDetailsStore在概念上不是会话作用域

    如果会话管理器试图序列化UserDetailsService,则可能是由于在其他会话作用域对象中引用了UserDetailsService