diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java index 7e2c9ad4..0a27dc35 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java @@ -21,6 +21,7 @@ import java.util.Map; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -64,6 +65,8 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration private ReactiveRedisConnectionFactory redisConnectionFactory; + private RedisSerializer defaultRedisSerializer; + private ClassLoader classLoader; private StringValueResolver embeddedValueResolver; @@ -107,6 +110,13 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration this.redisConnectionFactory = redisConnectionFactoryToUse; } + @Autowired(required = false) + @Qualifier("springSessionDefaultRedisSerializer") + public void setDefaultRedisSerializer( + RedisSerializer defaultRedisSerializer) { + this.defaultRedisSerializer = defaultRedisSerializer; + } + @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; @@ -134,10 +144,11 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration private ReactiveRedisTemplate createReactiveRedisTemplate() { RedisSerializer keySerializer = new StringRedisSerializer(); - RedisSerializer valueSerializer = new JdkSerializationRedisSerializer( - this.classLoader); + RedisSerializer defaultSerializer = (this.defaultRedisSerializer != null + ? this.defaultRedisSerializer + : new JdkSerializationRedisSerializer(this.classLoader)); RedisSerializationContext serializationContext = RedisSerializationContext - .newSerializationContext(valueSerializer) + .newSerializationContext(defaultSerializer) .key(keySerializer).hashKey(keySerializer).build(); return new ReactiveRedisTemplate<>(this.redisConnectionFactory, serializationContext); diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java index 26e470eb..f0e2c7a9 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java @@ -27,6 +27,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; import org.springframework.data.redis.core.ReactiveRedisOperations; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository; import org.springframework.session.data.redis.RedisFlushMode; import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory; @@ -181,6 +183,36 @@ public class RedisWebSessionConfigurationTests { .hasMessageContaining("expected single matching bean but found 2"); } + @Test + @SuppressWarnings("unchecked") + public void customRedisSerializerConfig() { + registerAndRefresh(RedisConfig.class, CustomRedisSerializerConfig.class); + + ReactiveRedisOperationsSessionRepository repository = this.context + .getBean(ReactiveRedisOperationsSessionRepository.class); + RedisSerializer redisSerializer = this.context + .getBean("springSessionDefaultRedisSerializer", RedisSerializer.class); + assertThat(repository).isNotNull(); + assertThat(redisSerializer).isNotNull(); + ReactiveRedisOperations redisOperations = (ReactiveRedisOperations) ReflectionTestUtils + .getField(repository, "sessionRedisOperations"); + assertThat(redisOperations).isNotNull(); + RedisSerializationContext serializationContext = redisOperations + .getSerializationContext(); + assertThat(ReflectionTestUtils.getField( + serializationContext.getValueSerializationPair().getReader(), + "serializer")).isEqualTo(redisSerializer); + assertThat(ReflectionTestUtils.getField( + serializationContext.getValueSerializationPair().getWriter(), + "serializer")).isEqualTo(redisSerializer); + assertThat(ReflectionTestUtils.getField( + serializationContext.getHashValueSerializationPair().getReader(), + "serializer")).isEqualTo(redisSerializer); + assertThat(ReflectionTestUtils.getField( + serializationContext.getHashValueSerializationPair().getWriter(), + "serializer")).isEqualTo(redisSerializer); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -275,4 +307,15 @@ public class RedisWebSessionConfigurationTests { } + @EnableRedisWebSession + static class CustomRedisSerializerConfig { + + @Bean + @SuppressWarnings("unchecked") + public RedisSerializer springSessionDefaultRedisSerializer() { + return mock(RedisSerializer.class); + } + + } + }