Amit
Amit

Reputation: 13

Spring Session not using custom RedisTemplate bean

Trying to use a RedisTemplate bean with GenericJackson2JsonRedisSerializer, but while debugging I noticed Spring Session uses a different RedisTemplate instance.

@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();
    }

When running this, Spring Session seems to use the default JdkSerializationRedisSerializer for hashValues, instead of the desired GenericJackson2JsonRedisSerializer.

Removing extends AbstractHttpSessionApplicationInitializer seems to make Spring use the correct RedisTempplate bean, but then Spring Session isn't wired at all.

Using Spring Session 1.3.3, and spring-boot-starter-data -redis 1.5.13.

Any idea what I'm missing?

Upvotes: 1

Views: 2173

Answers (2)

user1495042
user1495042

Reputation: 41

you just need to override default RedisSerializer for spring session like this

@Configuration public class RedisConfig {

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

Upvotes: 4

Monzurul Shimul
Monzurul Shimul

Reputation: 8386

You need to configure and register a RedisTemplate bean named sessionRedisTemplate. This will override the default RedisTemplate instance provided by RedisHttpSessionConfiguration.

You should configure it like:

@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;
}

Upvotes: 1

Related Questions