Skip to content

Commit 803c155

Browse files
committed
Order default customizers so that they can be overridden
Closes gh-36674
1 parent e25c267 commit 803c155

File tree

6 files changed

+101
-0
lines changed

6 files changed

+101
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/HazelcastSessionConfiguration.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.springframework.context.annotation.Bean;
2828
import org.springframework.context.annotation.Configuration;
2929
import org.springframework.context.annotation.Import;
30+
import org.springframework.core.Ordered;
31+
import org.springframework.core.annotation.Order;
3032
import org.springframework.session.SessionRepository;
3133
import org.springframework.session.config.SessionRepositoryCustomizer;
3234
import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository;
@@ -49,6 +51,7 @@
4951
class HazelcastSessionConfiguration {
5052

5153
@Bean
54+
@Order(Ordered.HIGHEST_PRECEDENCE)
5255
SessionRepositoryCustomizer<HazelcastIndexedSessionRepository> springBootSessionRepositoryCustomizer(
5356
SessionProperties sessionProperties, HazelcastSessionProperties hazelcastSessionProperties,
5457
ServerProperties serverProperties) {

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/MongoSessionConfiguration.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import org.springframework.context.annotation.Bean;
2626
import org.springframework.context.annotation.Configuration;
2727
import org.springframework.context.annotation.Import;
28+
import org.springframework.core.Ordered;
29+
import org.springframework.core.annotation.Order;
2830
import org.springframework.data.mongodb.core.MongoOperations;
2931
import org.springframework.session.SessionRepository;
3032
import org.springframework.session.config.SessionRepositoryCustomizer;
@@ -47,6 +49,7 @@
4749
class MongoSessionConfiguration {
4850

4951
@Bean
52+
@Order(Ordered.HIGHEST_PRECEDENCE)
5053
SessionRepositoryCustomizer<MongoIndexedSessionRepository> springBootSessionRepositoryCustomizer(
5154
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
5255
ServerProperties serverProperties) {

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/RedisSessionConfiguration.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.springframework.context.annotation.Bean;
2828
import org.springframework.context.annotation.Configuration;
2929
import org.springframework.context.annotation.Import;
30+
import org.springframework.core.Ordered;
31+
import org.springframework.core.annotation.Order;
3032
import org.springframework.data.redis.connection.RedisConnectionFactory;
3133
import org.springframework.data.redis.core.RedisTemplate;
3234
import org.springframework.session.SessionRepository;
@@ -61,6 +63,7 @@ class RedisSessionConfiguration {
6163
static class DefaultRedisSessionConfiguration {
6264

6365
@Bean
66+
@Order(Ordered.HIGHEST_PRECEDENCE)
6467
SessionRepositoryCustomizer<RedisSessionRepository> springBootSessionRepositoryCustomizer(
6568
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
6669
ServerProperties serverProperties) {
@@ -98,6 +101,7 @@ ConfigureRedisAction configureRedisAction(RedisSessionProperties redisSessionPro
98101
}
99102

100103
@Bean
104+
@Order(Ordered.HIGHEST_PRECEDENCE)
101105
SessionRepositoryCustomizer<RedisIndexedSessionRepository> springBootSessionRepositoryCustomizer(
102106
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
103107
ServerProperties serverProperties) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationHazelcastTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.Configuration;
3232
import org.springframework.session.FlushMode;
3333
import org.springframework.session.SaveMode;
34+
import org.springframework.session.config.SessionRepositoryCustomizer;
3435
import org.springframework.session.data.mongo.MongoIndexedSessionRepository;
3536
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
3637
import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository;
@@ -112,6 +113,17 @@ void customSaveMode() {
112113
});
113114
}
114115

116+
@Test
117+
void whenTheUserDefinesTheirOwnSessionRepositoryCustomizerThenDefaultConfigurationIsOverwritten() {
118+
this.contextRunner.withUserConfiguration(CustomizerConfiguration.class)
119+
.withPropertyValues("spring.session.hazelcast.save-mode=on-get-attribute")
120+
.run((context) -> {
121+
HazelcastIndexedSessionRepository repository = validateSessionRepository(context,
122+
HazelcastIndexedSessionRepository.class);
123+
assertThat(repository).hasFieldOrPropertyWithValue("saveMode", SaveMode.ALWAYS);
124+
});
125+
}
126+
115127
@Configuration(proxyBeanMethods = false)
116128
static class HazelcastConfiguration {
117129

@@ -127,4 +139,14 @@ HazelcastInstance hazelcastInstance() {
127139

128140
}
129141

142+
@Configuration(proxyBeanMethods = false)
143+
static class CustomizerConfiguration {
144+
145+
@Bean
146+
SessionRepositoryCustomizer<HazelcastIndexedSessionRepository> sessionRepositoryCustomizer() {
147+
return (repository) -> repository.setSaveMode(SaveMode.ALWAYS);
148+
}
149+
150+
}
151+
130152
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationMongoTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import org.springframework.boot.test.context.runner.ContextConsumer;
3333
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
3434
import org.springframework.boot.testsupport.testcontainers.DockerImageNames;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
37+
import org.springframework.session.config.SessionRepositoryCustomizer;
3538
import org.springframework.session.data.mongo.MongoIndexedSessionRepository;
3639
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
3740
import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository;
@@ -75,6 +78,13 @@ void mongoSessionStoreWithCustomizations() {
7578
.run(validateSpringSessionUsesMongo("foo"));
7679
}
7780

81+
@Test
82+
void whenTheUserDefinesTheirOwnSessionRepositoryCustomizerThenDefaultConfigurationIsOverwritten() {
83+
this.contextRunner.withUserConfiguration(CustomizerConfiguration.class)
84+
.withPropertyValues("spring.session.mongodb.collection-name=foo")
85+
.run(validateSpringSessionUsesMongo("customized"));
86+
}
87+
7888
private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUsesMongo(String collectionName) {
7989
return validateSpringSessionUsesMongo(collectionName,
8090
new ServerProperties().getServlet().getSession().getTimeout());
@@ -90,4 +100,14 @@ private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUs
90100
};
91101
}
92102

103+
@Configuration(proxyBeanMethods = false)
104+
static class CustomizerConfiguration {
105+
106+
@Bean
107+
SessionRepositoryCustomizer<MongoIndexedSessionRepository> sessionRepositoryCustomizer() {
108+
return (repository) -> repository.setCollectionName("customized");
109+
}
110+
111+
}
112+
93113
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@
3232
import org.springframework.boot.test.context.runner.ContextConsumer;
3333
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
3434
import org.springframework.boot.testsupport.testcontainers.RedisContainer;
35+
import org.springframework.context.annotation.Bean;
36+
import org.springframework.context.annotation.Configuration;
3537
import org.springframework.data.redis.connection.RedisConnection;
3638
import org.springframework.data.redis.connection.RedisConnectionFactory;
3739
import org.springframework.session.FlushMode;
3840
import org.springframework.session.SaveMode;
41+
import org.springframework.session.config.SessionRepositoryCustomizer;
3942
import org.springframework.session.data.mongo.MongoIndexedSessionRepository;
4043
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
4144
import org.springframework.session.data.redis.RedisSessionRepository;
@@ -165,6 +168,32 @@ void indexedRedisSessionWithCustomConfigureRedisActionBean() {
165168

166169
}
167170

171+
@Test
172+
void whenTheUserDefinesTheirOwnSessionRepositoryCustomizerThenDefaultConfigurationIsOverwritten() {
173+
this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
174+
.withUserConfiguration(CustomizerConfiguration.class)
175+
.withPropertyValues("spring.session.redis.flush-mode=immediate",
176+
"spring.data.redis.host=" + redis.getHost(), "spring.data.redis.port=" + redis.getFirstMappedPort())
177+
.run((context) -> {
178+
RedisSessionRepository repository = validateSessionRepository(context, RedisSessionRepository.class);
179+
assertThat(repository).hasFieldOrPropertyWithValue("flushMode", FlushMode.ON_SAVE);
180+
});
181+
}
182+
183+
@Test
184+
void whenIndexedAndTheUserDefinesTheirOwnSessionRepositoryCustomizerThenDefaultConfigurationIsOverwritten() {
185+
this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
186+
.withUserConfiguration(IndexedCustomizerConfiguration.class)
187+
.withPropertyValues("spring.session.redis.repository-type=indexed",
188+
"spring.session.redis.flush-mode=immediate", "spring.data.redis.host=" + redis.getHost(),
189+
"spring.data.redis.port=" + redis.getFirstMappedPort())
190+
.run((context) -> {
191+
RedisIndexedSessionRepository repository = validateSessionRepository(context,
192+
RedisIndexedSessionRepository.class);
193+
assertThat(repository).hasFieldOrPropertyWithValue("flushMode", FlushMode.ON_SAVE);
194+
});
195+
}
196+
168197
private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUsesDefaultRedis(String keyNamespace,
169198
FlushMode flushMode, SaveMode saveMode) {
170199
return (context) -> {
@@ -213,4 +242,24 @@ public void configure(RedisConnection connection) {
213242

214243
}
215244

245+
@Configuration(proxyBeanMethods = false)
246+
static class CustomizerConfiguration {
247+
248+
@Bean
249+
SessionRepositoryCustomizer<RedisSessionRepository> sessionRepositoryCustomizer() {
250+
return (repository) -> repository.setFlushMode(FlushMode.ON_SAVE);
251+
}
252+
253+
}
254+
255+
@Configuration(proxyBeanMethods = false)
256+
static class IndexedCustomizerConfiguration {
257+
258+
@Bean
259+
SessionRepositoryCustomizer<RedisIndexedSessionRepository> sessionRepositoryCustomizer() {
260+
return (repository) -> repository.setFlushMode(FlushMode.ON_SAVE);
261+
}
262+
263+
}
264+
216265
}

0 commit comments

Comments
 (0)