Browse Source

Improve WebReactiveConfigurerComposite

pull/1193/merge
Rossen Stoyanchev 9 years ago
parent
commit
7f6eaef305
  1. 78
      spring-web-reactive/src/main/java/org/springframework/web/reactive/config/WebReactiveConfigurerComposite.java

78
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.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
import org.springframework.http.codec.HttpMessageReader; 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. * A {@link WebReactiveConfigurer} that delegates to one or more others.
* *
* @author Brian Clozel * @author Brian Clozel
* @author Rossen Stoyanchev
* @since 5.0 * @since 5.0
*/ */
public class WebReactiveConfigurerComposite implements WebReactiveConfigurer { public class WebReactiveConfigurerComposite implements WebReactiveConfigurer {
private final List<WebReactiveConfigurer> delegates = new ArrayList<>(); private final List<WebReactiveConfigurer> delegates = new ArrayList<>();
public void addWebReactiveConfigurers(List<WebReactiveConfigurer> configurers) { public void addWebReactiveConfigurers(List<WebReactiveConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) { if (!CollectionUtils.isEmpty(configurers)) {
this.delegates.addAll(configurers); this.delegates.addAll(configurers);
} }
} }
@Override @Override
public Optional<RequestMappingHandlerMapping> createRequestMappingHandlerMapping() { public Optional<RequestMappingHandlerMapping> createRequestMappingHandlerMapping() {
Optional<RequestMappingHandlerMapping> selected = Optional.empty(); return createSingleBean(WebReactiveConfigurer::createRequestMappingHandlerMapping,
for (WebReactiveConfigurer configurer : this.delegates) { RequestMappingHandlerMapping.class);
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;
} }
@Override @Override
@ -69,18 +64,8 @@ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer {
@Override @Override
public Optional<RequestMappingHandlerAdapter> createRequestMappingHandlerAdapter() { public Optional<RequestMappingHandlerAdapter> createRequestMappingHandlerAdapter() {
Optional<RequestMappingHandlerAdapter> selected = Optional.empty(); return createSingleBean(WebReactiveConfigurer::createRequestMappingHandlerAdapter,
for (WebReactiveConfigurer configurer : this.delegates) { RequestMappingHandlerAdapter.class);
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;
} }
@Override @Override
@ -105,34 +90,12 @@ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer {
@Override @Override
public Optional<Validator> getValidator() { public Optional<Validator> getValidator() {
Optional<Validator> selected = Optional.empty(); return createSingleBean(WebReactiveConfigurer::getValidator, Validator.class);
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;
} }
@Override @Override
public Optional<MessageCodesResolver> getMessageCodesResolver() { public Optional<MessageCodesResolver> getMessageCodesResolver() {
Optional<MessageCodesResolver> selected = Optional.empty(); return createSingleBean(WebReactiveConfigurer::getMessageCodesResolver, MessageCodesResolver.class);
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;
} }
@Override @Override
@ -149,4 +112,23 @@ public class WebReactiveConfigurerComposite implements WebReactiveConfigurer {
public void configureViewResolvers(ViewResolverRegistry registry) { public void configureViewResolvers(ViewResolverRegistry registry) {
this.delegates.stream().forEach(delegate -> delegate.configureViewResolvers(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.");
}
}
} }

Loading…
Cancel
Save