diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java index 5e7e2eae..aa8883f1 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java @@ -280,8 +280,6 @@ public class RedisIndexedSessionRepository private final RedisSessionExpirationPolicy expirationPolicy; - private final IndexResolver indexResolver; - private ApplicationEventPublisher eventPublisher = (event) -> { }; @@ -291,6 +289,8 @@ public class RedisIndexedSessionRepository */ private Integer defaultMaxInactiveInterval; + private IndexResolver indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>()); + private RedisSerializer defaultSerializer = new JdkSerializationRedisSerializer(); private FlushMode flushMode = FlushMode.ON_SAVE; @@ -307,7 +307,6 @@ public class RedisIndexedSessionRepository this.sessionRedisOperations = sessionRedisOperations; this.expirationPolicy = new RedisSessionExpirationPolicy(sessionRedisOperations, this::getExpirationsKey, this::getSessionKey); - this.indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>()); configureSessionChannels(); } @@ -334,6 +333,15 @@ public class RedisIndexedSessionRepository this.defaultMaxInactiveInterval = defaultMaxInactiveInterval; } + /** + * Set the {@link IndexResolver} to use. + * @param indexResolver the index resolver + */ + public void setIndexResolver(IndexResolver indexResolver) { + Assert.notNull(indexResolver, "indexResolver cannot be null"); + this.indexResolver = indexResolver; + } + /** * Sets the default redis serializer. Replaces default serializer which is based on * {@link JdkSerializationRedisSerializer}. diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java index a352797e..677fc936 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java @@ -51,8 +51,10 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.session.FlushMode; +import org.springframework.session.IndexResolver; import org.springframework.session.MapSession; import org.springframework.session.SaveMode; +import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; import org.springframework.session.data.redis.RedisFlushMode; @@ -98,6 +100,8 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio private RedisConnectionFactory redisConnectionFactory; + private IndexResolver indexResolver; + private RedisSerializer defaultRedisSerializer; private ApplicationEventPublisher applicationEventPublisher; @@ -117,6 +121,9 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio RedisTemplate redisTemplate = createRedisTemplate(); RedisIndexedSessionRepository sessionRepository = new RedisIndexedSessionRepository(redisTemplate); sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher); + if (this.indexResolver != null) { + sessionRepository.setIndexResolver(this.indexResolver); + } if (this.defaultRedisSerializer != null) { sessionRepository.setDefaultSerializer(this.defaultRedisSerializer); } @@ -216,6 +223,11 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio this.applicationEventPublisher = applicationEventPublisher; } + @Autowired(required = false) + public void setIndexResolver(IndexResolver indexResolver) { + this.indexResolver = indexResolver; + } + @Autowired(required = false) @Qualifier("springSessionRedisTaskExecutor") public void setRedisTaskExecutor(Executor redisTaskExecutor) { diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java index bee60f6a..46812daa 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java @@ -36,7 +36,9 @@ import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.mock.env.MockEnvironment; import org.springframework.session.FlushMode; +import org.springframework.session.IndexResolver; import org.springframework.session.SaveMode; +import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.data.redis.RedisFlushMode; import org.springframework.session.data.redis.RedisIndexedSessionRepository; @@ -228,6 +230,17 @@ class RedisHttpSessionConfigurationTests { .withMessageContaining("expected single matching bean but found 2"); } + @Test + void customIndexResolverConfiguration() { + registerAndRefresh(RedisConfig.class, CustomIndexResolverConfiguration.class); + RedisIndexedSessionRepository repository = this.context.getBean(RedisIndexedSessionRepository.class); + @SuppressWarnings("unchecked") + IndexResolver indexResolver = this.context.getBean(IndexResolver.class); + assertThat(repository).isNotNull(); + assertThat(indexResolver).isNotNull(); + assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver); + } + @Test // gh-1252 void customRedisMessageListenerContainerConfig() { registerAndRefresh(RedisConfig.class, CustomRedisMessageListenerContainerConfig.class); @@ -414,6 +427,18 @@ class RedisHttpSessionConfigurationTests { } + @Configuration + @EnableRedisHttpSession + static class CustomIndexResolverConfiguration { + + @Bean + @SuppressWarnings("unchecked") + public IndexResolver indexResolver() { + return mock(IndexResolver.class); + } + + } + @Configuration @EnableRedisHttpSession static class CustomRedisMessageListenerContainerConfig { diff --git a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastIndexedSessionRepository.java b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastIndexedSessionRepository.java index 027f7528..4de118c6 100644 --- a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastIndexedSessionRepository.java +++ b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastIndexedSessionRepository.java @@ -133,8 +133,6 @@ public class HazelcastIndexedSessionRepository private final HazelcastInstance hazelcastInstance; - private final IndexResolver indexResolver; - private ApplicationEventPublisher eventPublisher = (event) -> { }; @@ -144,6 +142,8 @@ public class HazelcastIndexedSessionRepository */ private Integer defaultMaxInactiveInterval; + private IndexResolver indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>()); + private String sessionMapName = DEFAULT_SESSION_MAP_NAME; private FlushMode flushMode = FlushMode.ON_SAVE; @@ -161,7 +161,6 @@ public class HazelcastIndexedSessionRepository public HazelcastIndexedSessionRepository(HazelcastInstance hazelcastInstance) { Assert.notNull(hazelcastInstance, "HazelcastInstance must not be null"); this.hazelcastInstance = hazelcastInstance; - this.indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>()); } @PostConstruct @@ -197,6 +196,15 @@ public class HazelcastIndexedSessionRepository this.defaultMaxInactiveInterval = defaultMaxInactiveInterval; } + /** + * Set the {@link IndexResolver} to use. + * @param indexResolver the index resolver + */ + public void setIndexResolver(IndexResolver indexResolver) { + Assert.notNull(indexResolver, "indexResolver cannot be null"); + this.indexResolver = indexResolver; + } + /** * Set the name of map used to store sessions. * @param sessionMapName the session map name diff --git a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java index f3ae339c..51d70fb2 100644 --- a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java +++ b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java @@ -31,8 +31,10 @@ import org.springframework.context.annotation.ImportAware; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; import org.springframework.session.FlushMode; +import org.springframework.session.IndexResolver; import org.springframework.session.MapSession; import org.springframework.session.SaveMode; +import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; import org.springframework.session.hazelcast.HazelcastFlushMode; @@ -66,6 +68,8 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur private ApplicationEventPublisher applicationEventPublisher; + private IndexResolver indexResolver; + private List> sessionRepositoryCustomizers; @Bean @@ -73,6 +77,9 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur HazelcastIndexedSessionRepository sessionRepository = new HazelcastIndexedSessionRepository( this.hazelcastInstance); sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher); + if (this.indexResolver != null) { + sessionRepository.setIndexResolver(this.indexResolver); + } if (StringUtils.hasText(this.sessionMapName)) { sessionRepository.setSessionMapName(this.sessionMapName); } @@ -121,6 +128,11 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur this.applicationEventPublisher = applicationEventPublisher; } + @Autowired(required = false) + public void setIndexResolver(IndexResolver indexResolver) { + this.indexResolver = indexResolver; + } + @Autowired(required = false) public void setSessionRepositoryCustomizer( ObjectProvider> sessionRepositoryCustomizers) { diff --git a/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java b/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java index 41b2e483..0b65cc03 100644 --- a/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java +++ b/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java @@ -28,7 +28,9 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.annotation.Order; import org.springframework.session.FlushMode; +import org.springframework.session.IndexResolver; import org.springframework.session.SaveMode; +import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.hazelcast.HazelcastFlushMode; import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository; @@ -223,6 +225,17 @@ class HazelcastHttpSessionConfigurationTests { .withMessageContaining("expected single matching bean but found 2"); } + @Test + void customIndexResolverConfiguration() { + registerAndRefresh(CustomIndexResolverConfiguration.class); + HazelcastIndexedSessionRepository repository = this.context.getBean(HazelcastIndexedSessionRepository.class); + @SuppressWarnings("unchecked") + IndexResolver indexResolver = this.context.getBean(IndexResolver.class); + assertThat(repository).isNotNull(); + assertThat(indexResolver).isNotNull(); + assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver); + } + @Test void sessionRepositoryCustomizer() { registerAndRefresh(SessionRepositoryCustomizerConfiguration.class); @@ -433,6 +446,17 @@ class HazelcastHttpSessionConfigurationTests { } + @EnableHazelcastHttpSession + static class CustomIndexResolverConfiguration extends BaseConfiguration { + + @Bean + @SuppressWarnings("unchecked") + public IndexResolver indexResolver() { + return mock(IndexResolver.class); + } + + } + @EnableHazelcastHttpSession static class SessionRepositoryCustomizerConfiguration extends BaseConfiguration { diff --git a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java index 0e959c53..56fce740 100644 --- a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java +++ b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java @@ -198,8 +198,6 @@ public class JdbcIndexedSessionRepository private final ResultSetExtractor> extractor = new SessionResultSetExtractor(); - private final IndexResolver indexResolver; - /** * The name of database table used by Spring Session to store sessions. */ @@ -229,9 +227,11 @@ public class JdbcIndexedSessionRepository */ private Integer defaultMaxInactiveInterval; - private ConversionService conversionService; + private IndexResolver indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>()); - private LobHandler lobHandler; + private ConversionService conversionService = createDefaultConversionService(); + + private LobHandler lobHandler = new DefaultLobHandler(); private FlushMode flushMode = FlushMode.ON_SAVE; @@ -248,9 +248,6 @@ public class JdbcIndexedSessionRepository Assert.notNull(transactionOperations, "transactionOperations must not be null"); this.jdbcOperations = jdbcOperations; this.transactionOperations = transactionOperations; - this.indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>()); - this.conversionService = createDefaultConversionService(); - this.lobHandler = new DefaultLobHandler(); prepareQueries(); } @@ -355,6 +352,15 @@ public class JdbcIndexedSessionRepository this.defaultMaxInactiveInterval = defaultMaxInactiveInterval; } + /** + * Set the {@link IndexResolver} to use. + * @param indexResolver the index resolver + */ + public void setIndexResolver(IndexResolver indexResolver) { + Assert.notNull(indexResolver, "indexResolver cannot be null"); + this.indexResolver = indexResolver; + } + public void setLobHandler(LobHandler lobHandler) { Assert.notNull(lobHandler, "LobHandler must not be null"); this.lobHandler = lobHandler; diff --git a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java index 23e8bc52..363dfe8b 100644 --- a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java +++ b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java @@ -45,8 +45,10 @@ import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.session.FlushMode; +import org.springframework.session.IndexResolver; import org.springframework.session.MapSession; import org.springframework.session.SaveMode; +import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration; import org.springframework.session.jdbc.JdbcIndexedSessionRepository; @@ -95,6 +97,8 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration private TransactionOperations transactionOperations; + private IndexResolver indexResolver; + private LobHandler lobHandler; private ConversionService springSessionConversionService; @@ -121,6 +125,9 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration sessionRepository.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds); sessionRepository.setFlushMode(this.flushMode); sessionRepository.setSaveMode(this.saveMode); + if (this.indexResolver != null) { + sessionRepository.setIndexResolver(this.indexResolver); + } if (this.lobHandler != null) { sessionRepository.setLobHandler(this.lobHandler); } @@ -194,6 +201,11 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration this.transactionOperations = transactionOperations; } + @Autowired(required = false) + public void setIndexResolver(IndexResolver indexResolver) { + this.indexResolver = indexResolver; + } + @Autowired(required = false) @Qualifier("springSessionLobHandler") public void setLobHandler(LobHandler lobHandler) { diff --git a/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java b/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java index dbab4df8..9289be91 100644 --- a/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java +++ b/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java @@ -33,7 +33,9 @@ import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.support.lob.LobHandler; import org.springframework.mock.env.MockEnvironment; import org.springframework.session.FlushMode; +import org.springframework.session.IndexResolver; import org.springframework.session.SaveMode; +import org.springframework.session.Session; import org.springframework.session.config.SessionRepositoryCustomizer; import org.springframework.session.jdbc.JdbcIndexedSessionRepository; import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource; @@ -242,6 +244,17 @@ class JdbcHttpSessionConfigurationTests { assertThat(repository).hasFieldOrPropertyWithValue("transactionOperations", transactionOperations); } + @Test + void customIndexResolverConfiguration() { + registerAndRefresh(DataSourceConfiguration.class, CustomIndexResolverConfiguration.class); + JdbcIndexedSessionRepository repository = this.context.getBean(JdbcIndexedSessionRepository.class); + @SuppressWarnings("unchecked") + IndexResolver indexResolver = this.context.getBean(IndexResolver.class); + assertThat(repository).isNotNull(); + assertThat(indexResolver).isNotNull(); + assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver); + } + @Test void customLobHandlerConfiguration() { registerAndRefresh(DataSourceConfiguration.class, CustomLobHandlerConfiguration.class); @@ -452,6 +465,17 @@ class JdbcHttpSessionConfigurationTests { } + @EnableJdbcHttpSession + static class CustomIndexResolverConfiguration { + + @Bean + @SuppressWarnings("unchecked") + public IndexResolver indexResolver() { + return mock(IndexResolver.class); + } + + } + @EnableJdbcHttpSession static class CustomLobHandlerConfiguration {