Auto-configuration of reactive Spring Session

This commit is contained in:
Andy Wilkinson 2017-09-25 14:29:56 +01:00
parent 3d820adb4d
commit bdab4aa97e
3 changed files with 37 additions and 11 deletions

View File

@ -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,

View File

@ -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<StoreType, Class<?>> entry : MAPPINGS.entrySet()) {
if (entry.getValue().getName().equals(configurationClassName)) {
return entry.getKey();

View File

@ -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<WebSessionManager> webSessionManagerProvider) {
WebHttpHandlerBuilder builder = WebHttpHandlerBuilder
.applicationContext(this.applicationContext);
WebSessionManager webSessionManager = webSessionManagerProvider
.getIfAvailable();
if (webSessionManager != null) {
builder.sessionManager(webSessionManager);
}
return builder.build();
}
}