Skip to content

Commit feaf878

Browse files
committed
Add support for configuring custom IndexResolver
See: #1467
1 parent b357a76 commit feaf878

File tree

9 files changed

+144
-13
lines changed

9 files changed

+144
-13
lines changed

spring-session-data-redis/src/main/java/org/springframework/session/data/redis/RedisIndexedSessionRepository.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,6 @@ public class RedisIndexedSessionRepository
280280

281281
private final RedisSessionExpirationPolicy expirationPolicy;
282282

283-
private final IndexResolver<RedisSession> indexResolver;
284-
285283
private ApplicationEventPublisher eventPublisher = (event) -> {
286284
};
287285

@@ -291,6 +289,8 @@ public class RedisIndexedSessionRepository
291289
*/
292290
private Integer defaultMaxInactiveInterval;
293291

292+
private IndexResolver<Session> indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
293+
294294
private RedisSerializer<Object> defaultSerializer = new JdkSerializationRedisSerializer();
295295

296296
private FlushMode flushMode = FlushMode.ON_SAVE;
@@ -307,7 +307,6 @@ public RedisIndexedSessionRepository(RedisOperations<Object, Object> sessionRedi
307307
this.sessionRedisOperations = sessionRedisOperations;
308308
this.expirationPolicy = new RedisSessionExpirationPolicy(sessionRedisOperations, this::getExpirationsKey,
309309
this::getSessionKey);
310-
this.indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
311310
configureSessionChannels();
312311
}
313312

@@ -334,6 +333,15 @@ public void setDefaultMaxInactiveInterval(int defaultMaxInactiveInterval) {
334333
this.defaultMaxInactiveInterval = defaultMaxInactiveInterval;
335334
}
336335

336+
/**
337+
* Set the {@link IndexResolver} to use.
338+
* @param indexResolver the index resolver
339+
*/
340+
public void setIndexResolver(IndexResolver<Session> indexResolver) {
341+
Assert.notNull(indexResolver, "indexResolver cannot be null");
342+
this.indexResolver = indexResolver;
343+
}
344+
337345
/**
338346
* Sets the default redis serializer. Replaces default serializer which is based on
339347
* {@link JdkSerializationRedisSerializer}.

spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@
5151
import org.springframework.scheduling.annotation.SchedulingConfigurer;
5252
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
5353
import org.springframework.session.FlushMode;
54+
import org.springframework.session.IndexResolver;
5455
import org.springframework.session.MapSession;
5556
import org.springframework.session.SaveMode;
57+
import org.springframework.session.Session;
5658
import org.springframework.session.config.SessionRepositoryCustomizer;
5759
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
5860
import org.springframework.session.data.redis.RedisFlushMode;
@@ -98,6 +100,8 @@ public class RedisHttpSessionConfiguration extends SpringHttpSessionConfiguratio
98100

99101
private RedisConnectionFactory redisConnectionFactory;
100102

103+
private IndexResolver<Session> indexResolver;
104+
101105
private RedisSerializer<Object> defaultRedisSerializer;
102106

103107
private ApplicationEventPublisher applicationEventPublisher;
@@ -117,6 +121,9 @@ public RedisIndexedSessionRepository sessionRepository() {
117121
RedisTemplate<Object, Object> redisTemplate = createRedisTemplate();
118122
RedisIndexedSessionRepository sessionRepository = new RedisIndexedSessionRepository(redisTemplate);
119123
sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher);
124+
if (this.indexResolver != null) {
125+
sessionRepository.setIndexResolver(this.indexResolver);
126+
}
120127
if (this.defaultRedisSerializer != null) {
121128
sessionRepository.setDefaultSerializer(this.defaultRedisSerializer);
122129
}
@@ -216,6 +223,11 @@ public void setApplicationEventPublisher(ApplicationEventPublisher applicationEv
216223
this.applicationEventPublisher = applicationEventPublisher;
217224
}
218225

226+
@Autowired(required = false)
227+
public void setIndexResolver(IndexResolver<Session> indexResolver) {
228+
this.indexResolver = indexResolver;
229+
}
230+
219231
@Autowired(required = false)
220232
@Qualifier("springSessionRedisTaskExecutor")
221233
public void setRedisTaskExecutor(Executor redisTaskExecutor) {

spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
3737
import org.springframework.mock.env.MockEnvironment;
3838
import org.springframework.session.FlushMode;
39+
import org.springframework.session.IndexResolver;
3940
import org.springframework.session.SaveMode;
41+
import org.springframework.session.Session;
4042
import org.springframework.session.config.SessionRepositoryCustomizer;
4143
import org.springframework.session.data.redis.RedisFlushMode;
4244
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
@@ -228,6 +230,17 @@ void multipleConnectionFactoryRedisConfig() {
228230
.withMessageContaining("expected single matching bean but found 2");
229231
}
230232

233+
@Test
234+
void customIndexResolverConfiguration() {
235+
registerAndRefresh(RedisConfig.class, CustomIndexResolverConfiguration.class);
236+
RedisIndexedSessionRepository repository = this.context.getBean(RedisIndexedSessionRepository.class);
237+
@SuppressWarnings("unchecked")
238+
IndexResolver<Session> indexResolver = this.context.getBean(IndexResolver.class);
239+
assertThat(repository).isNotNull();
240+
assertThat(indexResolver).isNotNull();
241+
assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver);
242+
}
243+
231244
@Test // gh-1252
232245
void customRedisMessageListenerContainerConfig() {
233246
registerAndRefresh(RedisConfig.class, CustomRedisMessageListenerContainerConfig.class);
@@ -414,6 +427,18 @@ static class CustomRedisHttpSessionConfiguration2 {
414427

415428
}
416429

430+
@Configuration
431+
@EnableRedisHttpSession
432+
static class CustomIndexResolverConfiguration {
433+
434+
@Bean
435+
@SuppressWarnings("unchecked")
436+
public IndexResolver<Session> indexResolver() {
437+
return mock(IndexResolver.class);
438+
}
439+
440+
}
441+
417442
@Configuration
418443
@EnableRedisHttpSession
419444
static class CustomRedisMessageListenerContainerConfig {

spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/HazelcastIndexedSessionRepository.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,6 @@ public class HazelcastIndexedSessionRepository
133133

134134
private final HazelcastInstance hazelcastInstance;
135135

136-
private final IndexResolver<HazelcastSession> indexResolver;
137-
138136
private ApplicationEventPublisher eventPublisher = (event) -> {
139137
};
140138

@@ -144,6 +142,8 @@ public class HazelcastIndexedSessionRepository
144142
*/
145143
private Integer defaultMaxInactiveInterval;
146144

145+
private IndexResolver<Session> indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
146+
147147
private String sessionMapName = DEFAULT_SESSION_MAP_NAME;
148148

149149
private FlushMode flushMode = FlushMode.ON_SAVE;
@@ -161,7 +161,6 @@ public class HazelcastIndexedSessionRepository
161161
public HazelcastIndexedSessionRepository(HazelcastInstance hazelcastInstance) {
162162
Assert.notNull(hazelcastInstance, "HazelcastInstance must not be null");
163163
this.hazelcastInstance = hazelcastInstance;
164-
this.indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
165164
}
166165

167166
@PostConstruct
@@ -197,6 +196,15 @@ public void setDefaultMaxInactiveInterval(Integer defaultMaxInactiveInterval) {
197196
this.defaultMaxInactiveInterval = defaultMaxInactiveInterval;
198197
}
199198

199+
/**
200+
* Set the {@link IndexResolver} to use.
201+
* @param indexResolver the index resolver
202+
*/
203+
public void setIndexResolver(IndexResolver<Session> indexResolver) {
204+
Assert.notNull(indexResolver, "indexResolver cannot be null");
205+
this.indexResolver = indexResolver;
206+
}
207+
200208
/**
201209
* Set the name of map used to store sessions.
202210
* @param sessionMapName the session map name

spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@
3131
import org.springframework.core.annotation.AnnotationAttributes;
3232
import org.springframework.core.type.AnnotationMetadata;
3333
import org.springframework.session.FlushMode;
34+
import org.springframework.session.IndexResolver;
3435
import org.springframework.session.MapSession;
3536
import org.springframework.session.SaveMode;
37+
import org.springframework.session.Session;
3638
import org.springframework.session.config.SessionRepositoryCustomizer;
3739
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
3840
import org.springframework.session.hazelcast.HazelcastFlushMode;
@@ -66,13 +68,18 @@ public class HazelcastHttpSessionConfiguration extends SpringHttpSessionConfigur
6668

6769
private ApplicationEventPublisher applicationEventPublisher;
6870

71+
private IndexResolver<Session> indexResolver;
72+
6973
private List<SessionRepositoryCustomizer<HazelcastIndexedSessionRepository>> sessionRepositoryCustomizers;
7074

7175
@Bean
7276
public HazelcastIndexedSessionRepository sessionRepository() {
7377
HazelcastIndexedSessionRepository sessionRepository = new HazelcastIndexedSessionRepository(
7478
this.hazelcastInstance);
7579
sessionRepository.setApplicationEventPublisher(this.applicationEventPublisher);
80+
if (this.indexResolver != null) {
81+
sessionRepository.setIndexResolver(this.indexResolver);
82+
}
7683
if (StringUtils.hasText(this.sessionMapName)) {
7784
sessionRepository.setSessionMapName(this.sessionMapName);
7885
}
@@ -121,6 +128,11 @@ public void setApplicationEventPublisher(ApplicationEventPublisher applicationEv
121128
this.applicationEventPublisher = applicationEventPublisher;
122129
}
123130

131+
@Autowired(required = false)
132+
public void setIndexResolver(IndexResolver<Session> indexResolver) {
133+
this.indexResolver = indexResolver;
134+
}
135+
124136
@Autowired(required = false)
125137
public void setSessionRepositoryCustomizer(
126138
ObjectProvider<SessionRepositoryCustomizer<HazelcastIndexedSessionRepository>> sessionRepositoryCustomizers) {

spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@
2828
import org.springframework.context.annotation.Primary;
2929
import org.springframework.core.annotation.Order;
3030
import org.springframework.session.FlushMode;
31+
import org.springframework.session.IndexResolver;
3132
import org.springframework.session.SaveMode;
33+
import org.springframework.session.Session;
3234
import org.springframework.session.config.SessionRepositoryCustomizer;
3335
import org.springframework.session.hazelcast.HazelcastFlushMode;
3436
import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository;
@@ -223,6 +225,17 @@ void multipleHazelcastInstanceConfiguration() {
223225
.withMessageContaining("expected single matching bean but found 2");
224226
}
225227

228+
@Test
229+
void customIndexResolverConfiguration() {
230+
registerAndRefresh(CustomIndexResolverConfiguration.class);
231+
HazelcastIndexedSessionRepository repository = this.context.getBean(HazelcastIndexedSessionRepository.class);
232+
@SuppressWarnings("unchecked")
233+
IndexResolver<Session> indexResolver = this.context.getBean(IndexResolver.class);
234+
assertThat(repository).isNotNull();
235+
assertThat(indexResolver).isNotNull();
236+
assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver);
237+
}
238+
226239
@Test
227240
void sessionRepositoryCustomizer() {
228241
registerAndRefresh(SessionRepositoryCustomizerConfiguration.class);
@@ -433,6 +446,17 @@ public HazelcastInstance secondaryHazelcastInstance() {
433446

434447
}
435448

449+
@EnableHazelcastHttpSession
450+
static class CustomIndexResolverConfiguration extends BaseConfiguration {
451+
452+
@Bean
453+
@SuppressWarnings("unchecked")
454+
public IndexResolver<Session> indexResolver() {
455+
return mock(IndexResolver.class);
456+
}
457+
458+
}
459+
436460
@EnableHazelcastHttpSession
437461
static class SessionRepositoryCustomizerConfiguration extends BaseConfiguration {
438462

spring-session-jdbc/src/main/java/org/springframework/session/jdbc/JdbcIndexedSessionRepository.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,6 @@ public class JdbcIndexedSessionRepository
198198

199199
private final ResultSetExtractor<List<JdbcSession>> extractor = new SessionResultSetExtractor();
200200

201-
private final IndexResolver<JdbcSession> indexResolver;
202-
203201
/**
204202
* The name of database table used by Spring Session to store sessions.
205203
*/
@@ -229,9 +227,11 @@ public class JdbcIndexedSessionRepository
229227
*/
230228
private Integer defaultMaxInactiveInterval;
231229

232-
private ConversionService conversionService;
230+
private IndexResolver<Session> indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
231+
232+
private ConversionService conversionService = createDefaultConversionService();
233233

234-
private LobHandler lobHandler;
234+
private LobHandler lobHandler = new DefaultLobHandler();
235235

236236
private FlushMode flushMode = FlushMode.ON_SAVE;
237237

@@ -248,9 +248,6 @@ public JdbcIndexedSessionRepository(JdbcOperations jdbcOperations, TransactionOp
248248
Assert.notNull(transactionOperations, "transactionOperations must not be null");
249249
this.jdbcOperations = jdbcOperations;
250250
this.transactionOperations = transactionOperations;
251-
this.indexResolver = new DelegatingIndexResolver<>(new PrincipalNameIndexResolver<>());
252-
this.conversionService = createDefaultConversionService();
253-
this.lobHandler = new DefaultLobHandler();
254251
prepareQueries();
255252
}
256253

@@ -355,6 +352,15 @@ public void setDefaultMaxInactiveInterval(Integer defaultMaxInactiveInterval) {
355352
this.defaultMaxInactiveInterval = defaultMaxInactiveInterval;
356353
}
357354

355+
/**
356+
* Set the {@link IndexResolver} to use.
357+
* @param indexResolver the index resolver
358+
*/
359+
public void setIndexResolver(IndexResolver<Session> indexResolver) {
360+
Assert.notNull(indexResolver, "indexResolver cannot be null");
361+
this.indexResolver = indexResolver;
362+
}
363+
358364
public void setLobHandler(LobHandler lobHandler) {
359365
Assert.notNull(lobHandler, "LobHandler must not be null");
360366
this.lobHandler = lobHandler;

spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@
4545
import org.springframework.scheduling.annotation.SchedulingConfigurer;
4646
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
4747
import org.springframework.session.FlushMode;
48+
import org.springframework.session.IndexResolver;
4849
import org.springframework.session.MapSession;
4950
import org.springframework.session.SaveMode;
51+
import org.springframework.session.Session;
5052
import org.springframework.session.config.SessionRepositoryCustomizer;
5153
import org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration;
5254
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
@@ -95,6 +97,8 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration
9597

9698
private TransactionOperations transactionOperations;
9799

100+
private IndexResolver<Session> indexResolver;
101+
98102
private LobHandler lobHandler;
99103

100104
private ConversionService springSessionConversionService;
@@ -121,6 +125,9 @@ public JdbcIndexedSessionRepository sessionRepository() {
121125
sessionRepository.setDefaultMaxInactiveInterval(this.maxInactiveIntervalInSeconds);
122126
sessionRepository.setFlushMode(this.flushMode);
123127
sessionRepository.setSaveMode(this.saveMode);
128+
if (this.indexResolver != null) {
129+
sessionRepository.setIndexResolver(this.indexResolver);
130+
}
124131
if (this.lobHandler != null) {
125132
sessionRepository.setLobHandler(this.lobHandler);
126133
}
@@ -194,6 +201,11 @@ public void setTransactionOperations(TransactionOperations transactionOperations
194201
this.transactionOperations = transactionOperations;
195202
}
196203

204+
@Autowired(required = false)
205+
public void setIndexResolver(IndexResolver<Session> indexResolver) {
206+
this.indexResolver = indexResolver;
207+
}
208+
197209
@Autowired(required = false)
198210
@Qualifier("springSessionLobHandler")
199211
public void setLobHandler(LobHandler lobHandler) {

spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@
3333
import org.springframework.jdbc.support.lob.LobHandler;
3434
import org.springframework.mock.env.MockEnvironment;
3535
import org.springframework.session.FlushMode;
36+
import org.springframework.session.IndexResolver;
3637
import org.springframework.session.SaveMode;
38+
import org.springframework.session.Session;
3739
import org.springframework.session.config.SessionRepositoryCustomizer;
3840
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
3941
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
@@ -242,6 +244,17 @@ void customTransactionOperationsConfiguration() {
242244
assertThat(repository).hasFieldOrPropertyWithValue("transactionOperations", transactionOperations);
243245
}
244246

247+
@Test
248+
void customIndexResolverConfiguration() {
249+
registerAndRefresh(DataSourceConfiguration.class, CustomIndexResolverConfiguration.class);
250+
JdbcIndexedSessionRepository repository = this.context.getBean(JdbcIndexedSessionRepository.class);
251+
@SuppressWarnings("unchecked")
252+
IndexResolver<Session> indexResolver = this.context.getBean(IndexResolver.class);
253+
assertThat(repository).isNotNull();
254+
assertThat(indexResolver).isNotNull();
255+
assertThat(repository).hasFieldOrPropertyWithValue("indexResolver", indexResolver);
256+
}
257+
245258
@Test
246259
void customLobHandlerConfiguration() {
247260
registerAndRefresh(DataSourceConfiguration.class, CustomLobHandlerConfiguration.class);
@@ -452,6 +465,17 @@ public TransactionOperations springSessionTransactionOperations() {
452465

453466
}
454467

468+
@EnableJdbcHttpSession
469+
static class CustomIndexResolverConfiguration {
470+
471+
@Bean
472+
@SuppressWarnings("unchecked")
473+
public IndexResolver<Session> indexResolver() {
474+
return mock(IndexResolver.class);
475+
}
476+
477+
}
478+
455479
@EnableJdbcHttpSession
456480
static class CustomLobHandlerConfiguration {
457481

0 commit comments

Comments
 (0)