From b7e7bcf717df81d9c04520e1f53bf325250b7272 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 9 May 2016 08:07:25 +0200 Subject: [PATCH] Make `spring.session.store-type` mandatory Previously, Spring Session would be auto-configured by the mere presence of Spring Session in the classpath. This was fragile as determining a store type according to the environment could easily change when the classpath of the project changes. This commit makes the store-type property mandatory. If it is not set, Spring Session is no longer auto-configured. Closes gh-5838 --- .../session/SessionCondition.java | 2 +- .../session/SessionProperties.java | 2 +- .../boot/autoconfigure/session/StoreType.java | 10 +++++----- .../SessionAutoConfigurationTests.java | 19 +++++++++++++------ .../appendix-application-properties.adoc | 2 +- .../main/asciidoc/spring-boot-features.adoc | 19 +++++++++++++------ 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionCondition.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionCondition.java index bd9bbbeb982..13b6f9db5f3 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionCondition.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionCondition.java @@ -36,7 +36,7 @@ class SessionCondition extends SpringBootCondition { RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( context.getEnvironment(), "spring.session."); if (!resolver.containsProperty("store-type")) { - return ConditionOutcome.match("Automatic session store type"); + return ConditionOutcome.noMatch("Session store type not set"); } StoreType sessionStoreType = SessionStoreMappings .getType(((AnnotationMetadata) metadata).getClassName()); 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 33e111c25e8..180402d189d 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 @@ -32,7 +32,7 @@ import org.springframework.session.data.redis.RedisFlushMode; public class SessionProperties { /** - * Session store type, auto-detected according to the environment by default. + * Session store type. */ private StoreType storeType; diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java index d2bff4c4165..cc252e0f020 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/StoreType.java @@ -30,11 +30,6 @@ public enum StoreType { */ REDIS, - /** - * Hazelcast backed sessions. - */ - HAZELCAST, - /** * Mongo backed sessions. */ @@ -45,6 +40,11 @@ public enum StoreType { */ JDBC, + /** + * Hazelcast backed sessions. + */ + HAZELCAST, + /** * Simple in-memory map of sessions. */ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java index 9f10760c9ae..2b30d4b22c7 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationTests.java @@ -53,6 +53,18 @@ import static org.mockito.Mockito.verify; */ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurationTests { + @Test + public void autoConfigurationDisabledIfStoreTypeNotSet() { + load(); + assertThat(this.context.getBeansOfType(SessionRepository.class)).hasSize(0); + } + + @Test + public void autoConfigurationDisabledIfStoreTypeSetToNone() { + load("spring.session.store-type=none"); + assertThat(this.context.getBeansOfType(SessionRepository.class)).hasSize(0); + } + @Test public void backOffIfSessionRepositoryIsPresent() { load(Collections.>singletonList(SessionRepositoryConfiguration.class), @@ -86,12 +98,6 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat assertThat(getSessionTimeout(repository)).isNull(); } - @Test - public void hashMapSessionStoreIsDefault() { - load(); - validateSessionRepository(MapSessionRepository.class); - } - @Test public void jdbcSessionStore() { load(Arrays.asList(EmbeddedDataSourceConfiguration.class, @@ -153,6 +159,7 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat .isEqualTo("foobar"); } + @Configuration static class SessionRepositoryConfiguration { diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 7240e3573c0..8fa86af8e2c 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -362,7 +362,7 @@ content into your application; rather pick only the properties that you need. spring.session.mongo.collection-name=sessions # Collection name used to store sessions. spring.session.redis.flush-mode= # Flush mode for the Redis sessions. spring.session.redis.namespace= # Namespace for keys used to store sessions. - spring.session.store-type= # Session store type, auto-detected according to the environment by default. + spring.session.store-type= # Session store type. # SPRING SOCIAL ({sc-spring-boot-autoconfigure}/social/SocialWebAutoConfiguration.{sc-ext}[SocialWebAutoConfiguration]) spring.social.auto-connection-views=false # Enable the connection status view for supported providers. diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 9c872e013e3..d8a1c328474 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -4392,9 +4392,7 @@ class for more details. [[boot-features-session]] == Spring Session -Spring Boot provides Spring Session auto-configuration for a wide range of stores. If -Spring Session is available and you haven't defined a bean of type `SessionRepository`, -Spring Boot tries to detect the following session stores (in this order): +Spring Boot provides Spring Session auto-configuration for a wide range of stores: * JDBC * MongoDB @@ -4402,9 +4400,18 @@ Spring Boot tries to detect the following session stores (in this order): * Hazelcast * HashMap -It is also possible to _force_ the store to use via the `spring.session.store-type` -property. Each store have specific additional settings. For instance it is possible -to customize the name of the table for the jdbc store: +If Spring Session is available, you only need to chose the +{sc-spring-boot-autoconfigure}/session/StoreType.{sc-ext}[`StoreType`] that you wish to +use to store the sessions. For instance to use Redis as backend store, you'd configure +your application as follows: + +[source,properties,indent=0] +---- + spring.session.store-type=redis +---- + +Each store has specific additional settings. For instance it is possible to customize +the name of the table for the jdbc store: [source,properties,indent=0] ----