From bdab4aa97eccd347fd0289b44ca0a67283d67f5d Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 25 Sep 2017 14:29:56 +0100 Subject: [PATCH] Auto-configuration of reactive Spring Session --- .../session/SessionAutoConfiguration.java | 28 +++++++++++++++---- .../session/SessionStoreMappings.java | 4 +-- .../HttpHandlerAutoConfiguration.java | 16 +++++++++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java index 4dc62a9f57e..e2f7965fc74 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionAutoConfiguration.java @@ -23,18 +23,20 @@ import javax.annotation.PostConstruct; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration; import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; -import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryConfiguration; -import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryValidator; +import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; +import org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Configuration; @@ -56,15 +58,29 @@ import org.springframework.session.SessionRepository; */ @Configuration @ConditionalOnClass(Session.class) -@ConditionalOnWebApplication(type = Type.SERVLET) +@ConditionalOnWebApplication @EnableConfigurationProperties(SessionProperties.class) @AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class, JdbcTemplateAutoConfiguration.class, MongoAutoConfiguration.class, - RedisAutoConfiguration.class }) -@Import({ SessionRepositoryConfiguration.class, SessionRepositoryValidator.class, - SessionRepositoryFilterConfiguration.class }) + MongoReactiveAutoConfiguration.class, RedisAutoConfiguration.class, + RedisReactiveAutoConfiguration.class }) +@AutoConfigureBefore(HttpHandlerAutoConfiguration.class) public class SessionAutoConfiguration { + @Configuration + @ConditionalOnWebApplication(type = Type.SERVLET) + @Import({ SessionRepositoryConfiguration.class, SessionRepositoryValidator.class, + SessionRepositoryFilterConfiguration.class }) + static class ServletSessionConfiguration { + + } + + @Configuration + @ConditionalOnWebApplication(type = Type.REACTIVE) + static class ReactiveSessionConfiguration { + + } + @Configuration @ConditionalOnMissingBean(SessionRepository.class) @Import({ SessionRepositoryImplementationValidator.class, diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java index e48b112253d..dc3cb499fc0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/SessionStoreMappings.java @@ -45,14 +45,14 @@ final class SessionStoreMappings { private SessionStoreMappings() { } - public static String getConfigurationClass(StoreType sessionStoreType) { + static String getConfigurationClass(StoreType sessionStoreType) { Class configurationClass = MAPPINGS.get(sessionStoreType); Assert.state(configurationClass != null, () -> "Unknown session store type " + sessionStoreType); return configurationClass.getName(); } - public static StoreType getType(String configurationClassName) { + static StoreType getType(String configurationClassName) { for (Map.Entry> entry : MAPPINGS.entrySet()) { if (entry.getValue().getName().equals(configurationClassName)) { return entry.getKey(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/HttpHandlerAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/HttpHandlerAutoConfiguration.java index f5dec008d2c..d2aa905cdfd 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/HttpHandlerAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/HttpHandlerAutoConfiguration.java @@ -16,6 +16,7 @@ package org.springframework.boot.autoconfigure.web.reactive; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -29,12 +30,14 @@ import org.springframework.core.Ordered; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.web.reactive.DispatcherHandler; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; +import org.springframework.web.server.session.WebSessionManager; /** * {@link EnableAutoConfiguration Auto-configuration} for {@link HttpHandler}. * * @author Brian Clozel * @author Stephane Nicoll + * @author Andy Wilkinson * @since 2.0.0 */ @Configuration @@ -55,9 +58,16 @@ public class HttpHandlerAutoConfiguration { } @Bean - public HttpHandler httpHandler() { - return WebHttpHandlerBuilder.applicationContext(this.applicationContext) - .build(); + public HttpHandler httpHandler( + ObjectProvider webSessionManagerProvider) { + WebHttpHandlerBuilder builder = WebHttpHandlerBuilder + .applicationContext(this.applicationContext); + WebSessionManager webSessionManager = webSessionManagerProvider + .getIfAvailable(); + if (webSessionManager != null) { + builder.sessionManager(webSessionManager); + } + return builder.build(); } }