From 7f6eaef3057a200fbd93e82dc5144bd866c0772e Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 14 Oct 2016 17:55:40 -0400 Subject: [PATCH] Improve WebReactiveConfigurerComposite --- .../WebReactiveConfigurerComposite.java | 78 +++++++------------ 1 file changed, 30 insertions(+), 48 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfigurerComposite.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfigurerComposite.java index 0e5979e98a5..ec83ac67781 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfigurerComposite.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfigurerComposite.java @@ -3,6 +3,8 @@ package org.springframework.web.reactive.config; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.function.Function; +import java.util.stream.Collectors; import org.springframework.format.FormatterRegistry; import org.springframework.http.codec.HttpMessageReader; @@ -19,32 +21,25 @@ import org.springframework.web.reactive.result.method.annotation.RequestMappingH * A {@link WebReactiveConfigurer} that delegates to one or more others. * * @author Brian Clozel + * @author Rossen Stoyanchev * @since 5.0 */ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer { private final List delegates = new ArrayList<>(); + public void addWebReactiveConfigurers(List configurers) { if (!CollectionUtils.isEmpty(configurers)) { this.delegates.addAll(configurers); } } + @Override public Optional createRequestMappingHandlerMapping() { - Optional selected = Optional.empty(); - for (WebReactiveConfigurer configurer : this.delegates) { - Optional handlerMapping = configurer.createRequestMappingHandlerMapping(); - if (handlerMapping.isPresent()) { - if (selected != null) { - throw new IllegalStateException("No unique RequestMappingHandlerMapping found: {" + - selected.get() + ", " + handlerMapping.get() + "}"); - } - selected = handlerMapping; - } - } - return selected; + return createSingleBean(WebReactiveConfigurer::createRequestMappingHandlerMapping, + RequestMappingHandlerMapping.class); } @Override @@ -69,18 +64,8 @@ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer { @Override public Optional createRequestMappingHandlerAdapter() { - Optional selected = Optional.empty(); - for (WebReactiveConfigurer configurer : this.delegates) { - Optional handlerAdapter = configurer.createRequestMappingHandlerAdapter(); - if (handlerAdapter.isPresent()) { - if (selected != null) { - throw new IllegalStateException("No unique RequestMappingHandlerAdapter found: {" + - selected.get() + ", " + handlerAdapter.get() + "}"); - } - selected = handlerAdapter; - } - } - return selected; + return createSingleBean(WebReactiveConfigurer::createRequestMappingHandlerAdapter, + RequestMappingHandlerAdapter.class); } @Override @@ -105,34 +90,12 @@ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer { @Override public Optional getValidator() { - Optional selected = Optional.empty(); - for (WebReactiveConfigurer configurer : this.delegates) { - Optional validator = configurer.getValidator(); - if (validator.isPresent()) { - if (selected != null) { - throw new IllegalStateException("No unique Validator found: {" + - selected.get() + ", " + validator.get() + "}"); - } - selected = validator; - } - } - return selected; + return createSingleBean(WebReactiveConfigurer::getValidator, Validator.class); } @Override public Optional getMessageCodesResolver() { - Optional selected = Optional.empty(); - for (WebReactiveConfigurer configurer : this.delegates) { - Optional messageCodesResolver = configurer.getMessageCodesResolver(); - if (messageCodesResolver.isPresent()) { - if (selected != null) { - throw new IllegalStateException("No unique MessageCodesResolver found: {" + - selected.get() + ", " + messageCodesResolver.get() + "}"); - } - selected = messageCodesResolver; - } - } - return selected; + return createSingleBean(WebReactiveConfigurer::getMessageCodesResolver, MessageCodesResolver.class); } @Override @@ -149,4 +112,23 @@ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer { public void configureViewResolvers(ViewResolverRegistry registry) { this.delegates.stream().forEach(delegate -> delegate.configureViewResolvers(registry)); } + + private Optional createSingleBean(Function> factory, + Class beanType) { + + List> result = this.delegates.stream() + .map(factory).filter(Optional::isPresent).collect(Collectors.toList()); + + if (result.isEmpty()) { + return Optional.empty(); + } + else if (result.size() == 1) { + return result.get(1); + } + else { + throw new IllegalStateException("More than one WebReactiveConfigurer implements " + + beanType.getSimpleName() + " factory method."); + } + } + }