Spring 会话未使用自定义 RedisTemplate bean

Spring Session not using custom RedisTemplate bean

尝试将 RedisTemplate bean 与 GenericJackson2JsonRedisSerializer 一起使用,但在调试时我注意到 SpringSession 使用不同的 RedisTemplate 实例。

@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig extends 
    AbstractHttpSessionApplicationInitializer {

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    public RedisTemplate<Object, Object> redisTemplate() {
        final RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());

        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }

    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }

当 运行 这样时,Spring Session 似乎使用默认的 JdkSerializationRedisSerializer 作为哈希值,而不是所需的 GenericJackson2JsonRedisSerializer。

删除 extends AbstractHttpSessionApplicationInitializer 似乎使 Spring 使用了正确的 RedisTemplate bean,但是 Spring 会话根本没有连接。

使用 Spring 会话 1.3.3 和 spring-boot-starter-data -redis 1.5.13.

知道我错过了什么吗?

您需要配置并注册一个名为 sessionRedisTemplate 的 RedisTemplate bean。这将覆盖 RedisHttpSessionConfiguration.

提供的默认 RedisTemplate 实例

你应该这样配置:

@Bean
public RedisTemplate<Object, Object> sessionRedisTemplate() {
    final RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());

    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setConnectionFactory(jedisConnectionFactory());
    return template;
}

你只需要为 spring 会话重写默认的 RedisSerializer,就像这样

@Configuration public class RedisConfig {

@Bean(name="springSessionDefaultRedisSerializer")
public RedisSerializer serializer() {
    return new GenericJackson2JsonRedisSerializer();
}