|
|
|
@ -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."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|