访问存储在Redis中的Spring会话数据时出错

访问存储在Redis中的Spring会话数据时出错,spring,rest,session,redis,spring-data-redis,Spring,Rest,Session,Redis,Spring Data Redis,在我的REST控制器Spring项目中,我想在Redis中存储会话信息 在我的application.properties中,我定义了以下内容: spring.session.store-type=redis spring.session.redis.namespace=rdrestcore com.xyz.redis.host=192.168.201.46 com.xyz.redis.db=0 com.xyz.redis.port=6379 com.xyz.redis.pool.min-id

在我的REST控制器Spring项目中,我想在Redis中存储会话信息

在我的application.properties中,我定义了以下内容:

spring.session.store-type=redis
spring.session.redis.namespace=rdrestcore

com.xyz.redis.host=192.168.201.46
com.xyz.redis.db=0
com.xyz.redis.port=6379
com.xyz.redis.pool.min-idle=5
我还通过以下方式启用了Http Redis会话:

@Configuration
@EnableRedisHttpSession 
public class SessionConfig extends AbstractHttpSessionApplicationInitializer 
{}
我终于有了这样一个redis连接工厂:

@Configuration
@EnableRedisRepositories
public class RdRedisConnectionFactory {
    @Autowired 
    private Environment env;
    @Value("${com.xyz.redis.host}")
    private String redisHost;
    @Value("${com.xyz.redis.db}")
    private Integer redisDb;
    @Value("${com.xyz.redis.port}")
    private Integer redisPort;
    @Value("${com.xyz.redis.pool.min-idle}")
    private Integer redisPoolMinIdle;

    @Bean
    JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();        
        if(redisPoolMinIdle!=null) poolConfig.setMinIdle(redisPoolMinIdle);

        return poolConfig;
    }

    @Bean    
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory jedisConFactory = new JedisConnectionFactory();
        if(redisHost!=null) jedisConFactory.setHostName(redisHost);
        if(redisPort!=null) jedisConFactory.setPort(redisPort);
        if(redisDb!=null) jedisConFactory.setDatabase(redisDb);
        jedisConFactory.setPoolConfig(jedisPoolConfig());
        return jedisConFactory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate< String, Object > template =  new RedisTemplate();
        template.setConnectionFactory( jedisConnectionFactorySpring());
        template.setKeySerializer( new StringRedisSerializer() );
        template.setValueSerializer( new GenericJackson2JsonRedisSerializer() );
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer( new GenericJackson2JsonRedisSerializer() );

        return template;
    }
}
这个散列包含的键是:maxInactiveInterval、lastAccessedTime、creationTime、SessionAtr:SPRING\u SECURITY\u CONTEXT 但它们的值都是这样编码的:

\xAC\xED\x00\x05sr\x00\x0Ejava.lang.Long\x8B\xE4\x90\xCC\x8F\xDF\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xAC\x95\x1D\x0B\x94\xE0\x8B\x02\x00\x00xp\x00\x00\x01b$G\x88*

(用于creationTime键)

如果我试图通过redisTemplate从代码中访问此信息,则会出现如下异常:

目标VM中发生异常:无法反序列化;嵌套异常是 org.springframework.core.serializer.support.SerializationFailedException: 未能反序列化有效负载。字节数组是 DefaultDeserializer?的相应序列化?;嵌套异常 is java.io.StreamCorruptedException:无效流头:73657373 org.springframework.data.redis.serializer.SerializationException:无法反序列化;嵌套异常是 org.springframework.core.serializer.support.SerializationFailedException: 未能反序列化有效负载。字节数组是 DefaultDeserializer?的相应序列化?;嵌套异常 is java.io.StreamCorruptedException:无效流头:73657373 位于org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.deserialize(JdkSerializationRedisSerializer.java:82)

我认为Spring会话信息的序列化/反序列化存在某种问题,但我不知道还能做些什么来控制它

有人知道我做错了什么吗


谢谢你

你走对了方向,你的问题确实是。尝试此配置(仅使用这些序列化程序配置模板):


问题解决了吗?没有,我终于停止了访问Spring存储的会话信息的尝试
*spring:session:sessions:c1110241-0aed-4d40-9861-43553b3526cb*
template.setHashValueSerializer(new JdkSerializationRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setDefaultSerializer(new JdkSerializationRedisSerializer());