Skip to content

Commit 7a2dddf

Browse files
committed
Add support for configuring Spring Session SaveMode
1 parent 543fcdb commit 7a2dddf

11 files changed

+92
-13
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public void customize(SessionProperties sessionProperties,
5959
}
6060
setSessionMapName(hazelcastSessionProperties.getMapName());
6161
setFlushMode(hazelcastSessionProperties.getFlushMode());
62+
setSaveMode(hazelcastSessionProperties.getSaveMode());
6263
}
6364

6465
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.springframework.boot.context.properties.ConfigurationProperties;
2020
import org.springframework.session.FlushMode;
21+
import org.springframework.session.SaveMode;
2122

2223
/**
2324
* Configuration properties for Hazelcast backed Spring Session.
@@ -38,6 +39,11 @@ public class HazelcastSessionProperties {
3839
*/
3940
private FlushMode flushMode = FlushMode.ON_SAVE;
4041

42+
/**
43+
* Sessions save mode.
44+
*/
45+
private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE;
46+
4147
public String getMapName() {
4248
return this.mapName;
4349
}
@@ -54,4 +60,12 @@ public void setFlushMode(FlushMode flushMode) {
5460
this.flushMode = flushMode;
5561
}
5662

63+
public SaveMode getSaveMode() {
64+
return this.saveMode;
65+
}
66+
67+
public void setSaveMode(SaveMode saveMode) {
68+
this.saveMode = saveMode;
69+
}
70+
5771
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ void customize(SessionProperties sessionProperties, JdbcSessionProperties jdbcSe
6767
}
6868
setTableName(jdbcSessionProperties.getTableName());
6969
setCleanupCron(jdbcSessionProperties.getCleanupCron());
70+
setSaveMode(jdbcSessionProperties.getSaveMode());
7071
}
7172

7273
}

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2017 the original author or authors.
2+
* Copyright 2012-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
1818

1919
import org.springframework.boot.context.properties.ConfigurationProperties;
2020
import org.springframework.boot.jdbc.DataSourceInitializationMode;
21+
import org.springframework.session.SaveMode;
2122

2223
/**
2324
* Configuration properties for JDBC backed Spring Session.
@@ -55,6 +56,11 @@ public class JdbcSessionProperties {
5556
*/
5657
private DataSourceInitializationMode initializeSchema = DataSourceInitializationMode.EMBEDDED;
5758

59+
/**
60+
* Sessions save mode.
61+
*/
62+
private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE;
63+
5864
public String getSchema() {
5965
return this.schema;
6066
}
@@ -87,4 +93,12 @@ public void setInitializeSchema(DataSourceInitializationMode initializeSchema) {
8793
this.initializeSchema = initializeSchema;
8894
}
8995

96+
public SaveMode getSaveMode() {
97+
return this.saveMode;
98+
}
99+
100+
public void setSaveMode(SaveMode saveMode) {
101+
this.saveMode = saveMode;
102+
}
103+
90104
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ void customize(SessionProperties sessionProperties, RedisSessionProperties redis
5353
setMaxInactiveIntervalInSeconds((int) timeout.getSeconds());
5454
}
5555
setRedisNamespace(redisSessionProperties.getNamespace());
56+
setSaveMode(redisSessionProperties.getSaveMode());
5657
}
5758

5859
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public void customize(SessionProperties sessionProperties, RedisSessionPropertie
7676
setRedisNamespace(redisSessionProperties.getNamespace());
7777
setFlushMode(redisSessionProperties.getFlushMode());
7878
setCleanupCron(redisSessionProperties.getCleanupCron());
79+
setSaveMode(redisSessionProperties.getSaveMode());
7980
}
8081

8182
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.springframework.boot.context.properties.ConfigurationProperties;
2020
import org.springframework.session.FlushMode;
21+
import org.springframework.session.SaveMode;
2122

2223
/**
2324
* Configuration properties for Redis backed Spring Session.
@@ -51,6 +52,11 @@ public class RedisSessionProperties {
5152
*/
5253
private String cleanupCron = DEFAULT_CLEANUP_CRON;
5354

55+
/**
56+
* Sessions save mode.
57+
*/
58+
private SaveMode saveMode = SaveMode.ON_SET_ATTRIBUTE;
59+
5460
public String getNamespace() {
5561
return this.namespace;
5662
}
@@ -83,6 +89,14 @@ public void setConfigureAction(ConfigureAction configureAction) {
8389
this.configureAction = configureAction;
8490
}
8591

92+
public SaveMode getSaveMode() {
93+
return this.saveMode;
94+
}
95+
96+
public void setSaveMode(SaveMode saveMode) {
97+
this.saveMode = saveMode;
98+
}
99+
86100
/**
87101
* Strategies for configuring and validating Redis.
88102
*/

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext;
2626
import org.springframework.boot.test.context.runner.ContextConsumer;
2727
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
28+
import org.springframework.session.SaveMode;
2829
import org.springframework.session.data.mongo.ReactiveMongoOperationsSessionRepository;
2930
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository;
3031

@@ -47,31 +48,34 @@ void defaultConfig() {
4748
this.contextRunner.withPropertyValues("spring.session.store-type=redis")
4849
.withConfiguration(
4950
AutoConfigurations.of(RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class))
50-
.run(validateSpringSessionUsesRedis("spring:session:"));
51+
.run(validateSpringSessionUsesRedis("spring:session:", SaveMode.ON_SET_ATTRIBUTE));
5152
}
5253

5354
@Test
5455
void defaultConfigWithUniqueStoreImplementation() {
5556
this.contextRunner.withClassLoader(new FilteredClassLoader(ReactiveMongoOperationsSessionRepository.class))
5657
.withConfiguration(
5758
AutoConfigurations.of(RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class))
58-
.run(validateSpringSessionUsesRedis("spring:session:"));
59+
.run(validateSpringSessionUsesRedis("spring:session:", SaveMode.ON_SET_ATTRIBUTE));
5960
}
6061

6162
@Test
6263
void redisSessionStoreWithCustomizations() {
6364
this.contextRunner
6465
.withConfiguration(
6566
AutoConfigurations.of(RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class))
66-
.withPropertyValues("spring.session.store-type=redis", "spring.session.redis.namespace=foo")
67-
.run(validateSpringSessionUsesRedis("foo:"));
67+
.withPropertyValues("spring.session.store-type=redis", "spring.session.redis.namespace=foo",
68+
"spring.session.redis.save-mode=on-get-attribute")
69+
.run(validateSpringSessionUsesRedis("foo:", SaveMode.ON_GET_ATTRIBUTE));
6870
}
6971

70-
private ContextConsumer<AssertableReactiveWebApplicationContext> validateSpringSessionUsesRedis(String namespace) {
72+
private ContextConsumer<AssertableReactiveWebApplicationContext> validateSpringSessionUsesRedis(String namespace,
73+
SaveMode saveMode) {
7174
return (context) -> {
7275
ReactiveRedisOperationsSessionRepository repository = validateSessionRepository(context,
7376
ReactiveRedisOperationsSessionRepository.class);
7477
assertThat(repository).hasFieldOrPropertyWithValue("namespace", namespace);
78+
assertThat(repository).hasFieldOrPropertyWithValue("saveMode", saveMode);
7579
};
7680
}
7781

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.context.annotation.Bean;
2828
import org.springframework.context.annotation.Configuration;
2929
import org.springframework.session.FlushMode;
30+
import org.springframework.session.SaveMode;
3031
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
3132
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
3233
import org.springframework.session.hazelcast.HazelcastSessionRepository;
@@ -88,6 +89,16 @@ void customFlushMode() {
8889
});
8990
}
9091

92+
@Test
93+
void customSaveMode() {
94+
this.contextRunner.withPropertyValues("spring.session.store-type=hazelcast",
95+
"spring.session.hazelcast.save-mode=on-get-attribute").run((context) -> {
96+
HazelcastSessionRepository repository = validateSessionRepository(context,
97+
HazelcastSessionRepository.class);
98+
assertThat(repository).hasFieldOrPropertyWithValue("saveMode", SaveMode.ON_GET_ATTRIBUTE);
99+
});
100+
}
101+
91102
@Configuration(proxyBeanMethods = false)
92103
static class HazelcastConfiguration {
93104

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.boot.web.servlet.FilterRegistrationBean;
3131
import org.springframework.jdbc.BadSqlGrammarException;
3232
import org.springframework.jdbc.core.JdbcOperations;
33+
import org.springframework.session.SaveMode;
3334
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
3435
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
3536
import org.springframework.session.hazelcast.HazelcastSessionRepository;
@@ -129,4 +130,17 @@ void customCleanupCron() {
129130
});
130131
}
131132

133+
@Test
134+
void customSaveMode() {
135+
this.contextRunner
136+
.withPropertyValues("spring.session.store-type=jdbc", "spring.session.jdbc.save-mode=on-get-attribute")
137+
.run((context) -> {
138+
assertThat(context.getBean(JdbcSessionProperties.class).getSaveMode())
139+
.isEqualTo(SaveMode.ON_GET_ATTRIBUTE);
140+
SpringBootJdbcHttpSessionConfiguration configuration = context
141+
.getBean(SpringBootJdbcHttpSessionConfiguration.class);
142+
assertThat(configuration).hasFieldOrPropertyWithValue("saveMode", SaveMode.ON_GET_ATTRIBUTE);
143+
});
144+
}
145+
132146
}

0 commit comments

Comments
 (0)