Improve WebReactiveConfigurerComposite
This commit is contained in:
@@ -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<WebReactiveConfigurer> delegates = new ArrayList<>();
|
||||
|
||||
|
||||
public void addWebReactiveConfigurers(List<WebReactiveConfigurer> configurers) {
|
||||
if (!CollectionUtils.isEmpty(configurers)) {
|
||||
this.delegates.addAll(configurers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Optional<RequestMappingHandlerMapping> createRequestMappingHandlerMapping() {
|
||||
Optional<RequestMappingHandlerMapping> selected = Optional.empty();
|
||||
for (WebReactiveConfigurer configurer : this.delegates) {
|
||||
Optional<RequestMappingHandlerMapping> 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<RequestMappingHandlerAdapter> createRequestMappingHandlerAdapter() {
|
||||
Optional<RequestMappingHandlerAdapter> selected = Optional.empty();
|
||||
for (WebReactiveConfigurer configurer : this.delegates) {
|
||||
Optional<RequestMappingHandlerAdapter> 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<Validator> getValidator() {
|
||||
Optional<Validator> selected = Optional.empty();
|
||||
for (WebReactiveConfigurer configurer : this.delegates) {
|
||||
Optional<Validator> 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<MessageCodesResolver> getMessageCodesResolver() {
|
||||
Optional<MessageCodesResolver> selected = Optional.empty();
|
||||
for (WebReactiveConfigurer configurer : this.delegates) {
|
||||
Optional<MessageCodesResolver> 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 <T> Optional<T> createSingleBean(Function<WebReactiveConfigurer, Optional<T>> factory,
|
||||
Class<T> beanType) {
|
||||
|
||||
List<Optional<T>> 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.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user