@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2018 the original author or authors .
* Copyright 2002 - 2019 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -54,8 +54,9 @@ import org.springframework.web.reactive.result.method.SyncInvocableHandlerMethod
@@ -54,8 +54,9 @@ import org.springframework.web.reactive.result.method.SyncInvocableHandlerMethod
/ * *
* Package - private class to assist { @link RequestMappingHandlerAdapter } with
* resolving , initializing , and caching annotated methods declared in
* { @code @Controller } and { @code @ControllerAdvice } components . Assists with
* the following annotations :
* { @code @Controller } and { @code @ControllerAdvice } components .
*
* < p > Assists with the following annotations :
* < ul >
* < li > { @code @InitBinder }
* < li > { @code @ModelAttribute }
@ -112,56 +113,56 @@ class ControllerMethodResolver {
@@ -112,56 +113,56 @@ class ControllerMethodResolver {
private final Map < Class < ? > , SessionAttributesHandler > sessionAttributesHandlerCache = new ConcurrentHashMap < > ( 64 ) ;
ControllerMethodResolver ( ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry reactive Registry,
ControllerMethodResolver ( ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry adapter Registry,
ConfigurableApplicationContext context , List < HttpMessageReader < ? > > readers ) {
Assert . notNull ( customResolvers , "ArgumentResolverConfigurer is required" ) ;
Assert . notNull ( readers , "'messageReaders' is required" ) ;
Assert . notNull ( reactiveRegistry , "ReactiveAdapterRegistry is required" ) ;
Assert . notNull ( adapterRegistry , "ReactiveAdapterRegistry is required" ) ;
Assert . notNull ( context , "ApplicationContext is required" ) ;
Assert . notNull ( readers , "HttpMessageReader List is required" ) ;
this . initBinderResolvers = initBinderResolvers ( customResolvers , reactive Registry, context ) ;
this . modelAttributeResolvers = modelMethodResolvers ( customResolvers , reactive Registry, context ) ;
this . requestMappingResolvers = requestMappingResolvers ( customResolvers , reactive Registry, context , readers ) ;
this . exceptionHandlerResolvers = exceptionHandlerResolvers ( customResolvers , reactive Registry, context ) ;
this . reactiveAdapterRegistry = reactive Registry;
this . initBinderResolvers = initBinderResolvers ( customResolvers , adapter Registry, context ) ;
this . modelAttributeResolvers = modelMethodResolvers ( customResolvers , adapter Registry, context ) ;
this . requestMappingResolvers = requestMappingResolvers ( customResolvers , adapter Registry, context , readers ) ;
this . exceptionHandlerResolvers = exceptionHandlerResolvers ( customResolvers , adapter Registry, context ) ;
this . reactiveAdapterRegistry = adapter Registry;
initControllerAdviceCaches ( context ) ;
}
private List < SyncHandlerMethodArgumentResolver > initBinderResolvers (
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry reactive Registry,
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry adapter Registry,
ConfigurableApplicationContext context ) {
return initResolvers ( customResolvers , reactive Registry, context , false , Collections . emptyList ( ) ) . stream ( )
return initResolvers ( customResolvers , adapter Registry, context , false , Collections . emptyList ( ) ) . stream ( )
. filter ( resolver - > resolver instanceof SyncHandlerMethodArgumentResolver )
. map ( resolver - > ( SyncHandlerMethodArgumentResolver ) resolver )
. collect ( Collectors . toList ( ) ) ;
}
private static List < HandlerMethodArgumentResolver > modelMethodResolvers (
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry reactive Registry,
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry adapter Registry,
ConfigurableApplicationContext context ) {
return initResolvers ( customResolvers , reactive Registry, context , true , Collections . emptyList ( ) ) ;
return initResolvers ( customResolvers , adapter Registry, context , true , Collections . emptyList ( ) ) ;
}
private static List < HandlerMethodArgumentResolver > requestMappingResolvers (
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry reactive Registry,
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry adapter Registry,
ConfigurableApplicationContext context , List < HttpMessageReader < ? > > readers ) {
return initResolvers ( customResolvers , reactive Registry, context , true , readers ) ;
return initResolvers ( customResolvers , adapter Registry, context , true , readers ) ;
}
private static List < HandlerMethodArgumentResolver > exceptionHandlerResolvers (
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry reactive Registry,
ArgumentResolverConfigurer customResolvers , ReactiveAdapterRegistry adapter Registry,
ConfigurableApplicationContext context ) {
return initResolvers ( customResolvers , reactive Registry, context , false , Collections . emptyList ( ) ) ;
return initResolvers ( customResolvers , adapter Registry, context , false , Collections . emptyList ( ) ) ;
}
private static List < HandlerMethodArgumentResolver > initResolvers ( ArgumentResolverConfigurer customResolvers ,
ReactiveAdapterRegistry reactive Registry, ConfigurableApplicationContext context ,
ReactiveAdapterRegistry adapter Registry, ConfigurableApplicationContext context ,
boolean supportDataBinding , List < HttpMessageReader < ? > > readers ) {
ConfigurableListableBeanFactory beanFactory = context . getBeanFactory ( ) ;
@ -169,48 +170,48 @@ class ControllerMethodResolver {
@@ -169,48 +170,48 @@ class ControllerMethodResolver {
// Annotation-based...
List < HandlerMethodArgumentResolver > result = new ArrayList < > ( ) ;
result . add ( new RequestParamMethodArgumentResolver ( beanFactory , reactive Registry, false ) ) ;
result . add ( new RequestParamMapMethodArgumentResolver ( reactive Registry) ) ;
result . add ( new PathVariableMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new PathVariableMapMethodArgumentResolver ( reactive Registry) ) ;
result . add ( new MatrixVariableMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new MatrixVariableMapMethodArgumentResolver ( reactive Registry) ) ;
result . add ( new RequestParamMethodArgumentResolver ( beanFactory , adapter Registry, false ) ) ;
result . add ( new RequestParamMapMethodArgumentResolver ( adapter Registry) ) ;
result . add ( new PathVariableMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
result . add ( new PathVariableMapMethodArgumentResolver ( adapter Registry) ) ;
result . add ( new MatrixVariableMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
result . add ( new MatrixVariableMapMethodArgumentResolver ( adapter Registry) ) ;
if ( ! readers . isEmpty ( ) ) {
result . add ( new RequestBodyArgumentResolver ( readers , reactive Registry) ) ;
result . add ( new RequestPartMethodArgumentResolver ( readers , reactive Registry) ) ;
result . add ( new RequestBodyArgumentResolver ( readers , adapter Registry) ) ;
result . add ( new RequestPartMethodArgumentResolver ( readers , adapter Registry) ) ;
}
if ( supportDataBinding ) {
result . add ( new ModelAttributeMethodArgumentResolver ( reactive Registry, false ) ) ;
result . add ( new ModelAttributeMethodArgumentResolver ( adapter Registry, false ) ) ;
}
result . add ( new RequestHeaderMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new RequestHeaderMapMethodArgumentResolver ( reactive Registry) ) ;
result . add ( new CookieValueMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new ExpressionValueMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new SessionAttributeMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new RequestAttributeMethodArgumentResolver ( beanFactory , reactive Registry) ) ;
result . add ( new RequestHeaderMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
result . add ( new RequestHeaderMapMethodArgumentResolver ( adapter Registry) ) ;
result . add ( new CookieValueMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
result . add ( new ExpressionValueMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
result . add ( new SessionAttributeMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
result . add ( new RequestAttributeMethodArgumentResolver ( beanFactory , adapter Registry) ) ;
// Type-based...
if ( ! readers . isEmpty ( ) ) {
result . add ( new HttpEntityArgumentResolver ( readers , reactive Registry) ) ;
result . add ( new HttpEntityArgumentResolver ( readers , adapter Registry) ) ;
}
result . add ( new ModelArgumentResolver ( reactive Registry) ) ;
result . add ( new ModelArgumentResolver ( adapter Registry) ) ;
if ( supportDataBinding ) {
result . add ( new ErrorsMethodArgumentResolver ( reactive Registry) ) ;
result . add ( new ErrorsMethodArgumentResolver ( adapter Registry) ) ;
}
result . add ( new ServerWebExchangeArgumentResolver ( reactive Registry) ) ;
result . add ( new PrincipalArgumentResolver ( reactive Registry) ) ;
result . add ( new ServerWebExchangeArgumentResolver ( adapter Registry) ) ;
result . add ( new PrincipalArgumentResolver ( adapter Registry) ) ;
if ( requestMappingMethod ) {
result . add ( new SessionStatusMethodArgumentResolver ( ) ) ;
}
result . add ( new WebSessionArgumentResolver ( reactive Registry) ) ;
result . add ( new WebSessionArgumentResolver ( adapter Registry) ) ;
// Custom...
result . addAll ( customResolvers . getCustomResolvers ( ) ) ;
// Catch-all...
result . add ( new RequestParamMethodArgumentResolver ( beanFactory , reactive Registry, true ) ) ;
result . add ( new RequestParamMethodArgumentResolver ( beanFactory , adapter Registry, true ) ) ;
if ( supportDataBinding ) {
result . add ( new ModelAttributeMethodArgumentResolver ( reactive Registry, true ) ) ;
result . add ( new ModelAttributeMethodArgumentResolver ( adapter Registry, true ) ) ;
}
return result ;
@ -336,7 +337,6 @@ class ControllerMethodResolver {
@@ -336,7 +337,6 @@ class ControllerMethodResolver {
* /
@Nullable
public InvocableHandlerMethod getExceptionHandlerMethod ( Throwable ex , HandlerMethod handlerMethod ) {
Class < ? > handlerType = handlerMethod . getBeanType ( ) ;
// Controller-local first...