@ -3,6 +3,8 @@ package org.springframework.web.reactive.config;
@@ -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
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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." ) ;
}
}
}