Skip to content

Commit 4d2d7b0

Browse files
committed
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.
1 parent 6069756 commit 4d2d7b0

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
@@ -52,6 +52,8 @@ public void defaultConfig() {
5252
JdbcOperationsSessionRepository.class);
5353
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
5454
.isEqualTo("SPRING_SESSION");
55+
assertThat(this.context.getBean(SessionProperties.class)
56+
.getJdbc().getInitializer().isEnabled()).isTrue();
5557
assertThat(this.context.getBean(JdbcOperations.class)
5658
.queryForList("select * from SPRING_SESSION")).isEmpty();
5759
}
@@ -66,6 +68,8 @@ public void disableDatabaseInitializer() {
6668
JdbcOperationsSessionRepository.class);
6769
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
6870
.isEqualTo("SPRING_SESSION");
71+
assertThat(this.context.getBean(SessionProperties.class)
72+
.getJdbc().getInitializer().isEnabled()).isFalse();
6973
this.thrown.expect(BadSqlGrammarException.class);
7074
assertThat(this.context.getBean(JdbcOperations.class)
7175
.queryForList("select * from SPRING_SESSION")).isEmpty();
@@ -82,8 +86,27 @@ public void customTableName() {
8286
JdbcOperationsSessionRepository.class);
8387
assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName"))
8488
.isEqualTo("FOO_BAR");
89+
assertThat(this.context.getBean(SessionProperties.class)
90+
.getJdbc().getInitializer().isEnabled()).isTrue();
8591
assertThat(this.context.getBean(JdbcOperations.class)
8692
.queryForList("select * from FOO_BAR")).isEmpty();
8793
}
8894

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

0 commit comments

Comments
 (0)