【问题标题】:Spring Session not using custom RedisTemplate beanSpring Session 不使用自定义 RedisTemplate bean
【发布时间】:2018-11-28 08:12:13
【问题描述】:

尝试使用带有 GenericJackson2JsonRedisSerializer 的 RedisTemplate bean,但在调试时我注意到 Spring Session 使用了不同的 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 似乎对 hashValues 使用默认的 JdkSerializationRedisSerializer,而不是所需的 GenericJackson2JsonRedisSerializer。

删除 extends AbstractHttpSessionApplicationInitializer 似乎使 Spring 使用正确的 RedisTempplate bean,但 Spring Session 根本没有连接。

使用 Spring Session 1.3.3 和 spring-boot-starter-data -redis 1.5.13。

知道我错过了什么吗?

【问题讨论】:

    标签: spring spring-boot spring-security redis spring-session


    【解决方案1】:

    你只需要像这样为 spring 会话覆盖默认的 RedisSerializer

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

    【讨论】:

      【解决方案2】:

      您需要配置和注册一个名为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;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-29
        • 2021-07-27
        • 2015-07-09
        • 2019-09-13
        • 1970-01-01
        • 2017-12-28
        • 2018-09-17
        • 2014-01-04
        • 2018-01-05
        相关资源
        最近更新 更多