From 4d2d7b0c11ff02e49accde5c1fb000e891d9ca4a Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Sat, 13 Aug 2016 22:29:43 +0200 Subject: [PATCH] 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. --- .../session/SessionProperties.java | 12 +++++++--- .../SessionAutoConfigurationJdbcTests.java | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java index 5134a91a3378..84c9b1e98c62 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionProperties.java @@ -107,6 +107,8 @@ public static class Jdbc { private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/springframework/" + "session/jdbc/schema-@@platform@@.sql"; + private static final String DEFAULT_TABLE_NAME = "SPRING_SESSION"; + /** * Path to the SQL file to use to initialize the database schema. */ @@ -115,7 +117,7 @@ public static class Jdbc { /** * Name of database table used to store sessions. */ - private String tableName = "SPRING_SESSION"; + private String tableName = DEFAULT_TABLE_NAME; private final Initializer initializer = new Initializer(); @@ -139,7 +141,7 @@ public Initializer getInitializer() { return this.initializer; } - public static class Initializer { + public class Initializer { /** * Create the required session tables on startup if necessary. @@ -147,7 +149,11 @@ public static class Initializer { private boolean enabled = true; public boolean isEnabled() { - return this.enabled; + boolean isDefaultTableName = DEFAULT_TABLE_NAME.equals( + Jdbc.this.getTableName()); + boolean isDefaultSchema = DEFAULT_SCHEMA_LOCATION.equals( + Jdbc.this.getSchema()); + return this.enabled && (isDefaultTableName || !isDefaultSchema); } public void setEnabled(boolean enabled) { diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java index c9fe9d7f521e..d81f91ae318a 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java @@ -52,6 +52,8 @@ public void defaultConfig() { JdbcOperationsSessionRepository.class); assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) .isEqualTo("SPRING_SESSION"); + assertThat(this.context.getBean(SessionProperties.class) + .getJdbc().getInitializer().isEnabled()).isTrue(); assertThat(this.context.getBean(JdbcOperations.class) .queryForList("select * from SPRING_SESSION")).isEmpty(); } @@ -66,6 +68,8 @@ public void disableDatabaseInitializer() { JdbcOperationsSessionRepository.class); assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) .isEqualTo("SPRING_SESSION"); + assertThat(this.context.getBean(SessionProperties.class) + .getJdbc().getInitializer().isEnabled()).isFalse(); this.thrown.expect(BadSqlGrammarException.class); assertThat(this.context.getBean(JdbcOperations.class) .queryForList("select * from SPRING_SESSION")).isEmpty(); @@ -82,8 +86,27 @@ public void customTableName() { JdbcOperationsSessionRepository.class); assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) .isEqualTo("FOO_BAR"); + assertThat(this.context.getBean(SessionProperties.class) + .getJdbc().getInitializer().isEnabled()).isTrue(); assertThat(this.context.getBean(JdbcOperations.class) .queryForList("select * from FOO_BAR")).isEmpty(); } + @Test + public void customTableNameWithDefaultSchemaDisablesInitializer() { + load(Arrays.asList(EmbeddedDataSourceConfiguration.class, + DataSourceTransactionManagerAutoConfiguration.class), + "spring.session.store-type=jdbc", + "spring.session.jdbc.table-name=FOO_BAR"); + JdbcOperationsSessionRepository repository = validateSessionRepository( + JdbcOperationsSessionRepository.class); + assertThat(new DirectFieldAccessor(repository).getPropertyValue("tableName")) + .isEqualTo("FOO_BAR"); + assertThat(this.context.getBean(SessionProperties.class) + .getJdbc().getInitializer().isEnabled()).isFalse(); + this.thrown.expect(BadSqlGrammarException.class); + assertThat(this.context.getBean(JdbcOperations.class) + .queryForList("select * from SPRING_SESSION")).isEmpty(); + } + }