Skip to content

Commit 9141177

Browse files
vpavicsnicoll
authored andcommitted
Validate Spring Session database initializer configuration
This commit adds Spring Session JDBC configuration validation that disables database initializer in case custom table name is configured with default schema. See gh-6649
1 parent 07b2fe1 commit 9141177

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ public static class Jdbc {
107107
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/"
108108
+ "session/jdbc/schema-@@platform@@.sql";
109109

110+
private static final String DEFAULT_TABLE_NAME = "SPRING_SESSION";
111+
110112
/**
111113
* Path to the SQL file to use to initialize the database schema.
112114
*/
@@ -115,7 +117,7 @@ public static class Jdbc {
115117
/**
116118
* Name of database table used to store sessions.
117119
*/
118-
private String tableName = "SPRING_SESSION";
120+
private String tableName = DEFAULT_TABLE_NAME;
119121

120122
private final Initializer initializer = new Initializer();
121123

@@ -139,15 +141,19 @@ public Initializer getInitializer() {
139141
return this.initializer;
140142
}
141143

142-
public static class Initializer {
144+
public class Initializer {
143145

144146
/**
145147
* Create the required session tables on startup if necessary.
146148
*/
147149
private boolean enabled = true;
148150

149151
public boolean isEnabled() {
150-
return this.enabled;
152+
boolean isDefaultTableName = DEFAULT_TABLE_NAME.equals(
153+
Jdbc.this.getTableName());
154+
boolean isDefaultSchema = DEFAULT_SCHEMA_LOCATION.equals(
155+
Jdbc.this.getSchema());
156+
return this.enabled && (isDefaultTableName || !isDefaultSchema);
151157
}
152158

153159
public void setEnabled(boolean enabled) {

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public void defaultConfig() {
5454
JdbcOperationsSessionRepository.class);
5555
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
5656
.isEqualTo("SPRING_SESSION");
57+
assertThat(this.context.getBean(SessionProperties.class)
58+
.getJdbc().getInitializer().isEnabled()).isTrue();
5759
assertThat(this.context.getBean(JdbcOperations.class)
5860
.queryForList("select * from SPRING_SESSION")).isEmpty();
5961
}
@@ -68,6 +70,8 @@ public void disableDatabaseInitializer() {
6870
JdbcOperationsSessionRepository.class);
6971
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
7072
.isEqualTo("SPRING_SESSION");
73+
assertThat(this.context.getBean(SessionProperties.class)
74+
.getJdbc().getInitializer().isEnabled()).isFalse();
7175
this.thrown.expect(BadSqlGrammarException.class);
7276
assertThat(this.context.getBean(JdbcOperations.class)
7377
.queryForList("select * from SPRING_SESSION")).isEmpty();
@@ -84,8 +88,27 @@ public void customTableName() {
8488
JdbcOperationsSessionRepository.class);
8589
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
8690
.isEqualTo("FOO_BAR");
91+
assertThat(this.context.getBean(SessionProperties.class)
92+
.getJdbc().getInitializer().isEnabled()).isTrue();
8793
assertThat(this.context.getBean(JdbcOperations.class)
8894
.queryForList("select * from FOO_BAR")).isEmpty();
8995
}
9096

97+
@Test
98+
public void customTableNameWithDefaultSchemaDisablesInitializer() {
99+
load(Arrays.asList(EmbeddedDataSourceConfiguration.class,
100+
DataSourceTransactionManagerAutoConfiguration.class),
101+
"spring.session.store-type=jdbc",
102+
"spring.session.jdbc.table-name=FOO_BAR");
103+
JdbcOperationsSessionRepository repository = validateSessionRepository(
104+
JdbcOperationsSessionRepository.class);
105+
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
106+
.isEqualTo("FOO_BAR");
107+
assertThat(this.context.getBean(SessionProperties.class)
108+
.getJdbc().getInitializer().isEnabled()).isFalse();
109+
this.thrown.expect(BadSqlGrammarException.class);
110+
assertThat(this.context.getBean(JdbcOperations.class)
111+
.queryForList("select * from SPRING_SESSION")).isEmpty();
112+
}
113+
91114
}

0 commit comments

Comments
 (0)