Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
18854ee5
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
18854ee5
编写于
5月 15, 2018
作者:
R
Rossen Stoyanchev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Polish: simplify ControllerMethodResolver initialization
上级
7424ca57
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
87 addition
and
139 deletion
+87
-139
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java
...ve/result/method/annotation/ControllerMethodResolver.java
+84
-136
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java
...esult/method/annotation/RequestMappingHandlerAdapter.java
+1
-1
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolverTests.java
...sult/method/annotation/ControllerMethodResolverTests.java
+1
-1
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ModelInitializerTests.java
...ctive/result/method/annotation/ModelInitializerTests.java
+1
-1
未找到文件。
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java
浏览文件 @
18854ee5
/*
* Copyright 2002-201
7
the original author or authors.
* Copyright 2002-201
8
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.
...
...
@@ -24,8 +24,6 @@ import java.util.List;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.function.Function
;
import
java.util.function.Supplier
;
import
java.util.stream.Collectors
;
import
org.apache.commons.logging.Log
;
...
...
@@ -40,7 +38,6 @@ import org.springframework.core.annotation.AnnotationUtils;
import
org.springframework.http.codec.HttpMessageReader
;
import
org.springframework.lang.Nullable
;
import
org.springframework.util.Assert
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ReflectionUtils
;
import
org.springframework.web.bind.annotation.InitBinder
;
import
org.springframework.web.bind.annotation.ModelAttribute
;
...
...
@@ -53,7 +50,7 @@ import org.springframework.web.reactive.result.method.InvocableHandlerMethod;
import
org.springframework.web.reactive.result.method.SyncHandlerMethodArgumentResolver
;
import
org.springframework.web.reactive.result.method.SyncInvocableHandlerMethod
;
import
static
org
.
springframework
.
core
.
MethodIntrospector
.
selectMethods
;
import
static
org
.
springframework
.
core
.
MethodIntrospector
.
*
;
/**
* Package-private class to assist {@link RequestMappingHandlerAdapter} with
...
...
@@ -102,81 +99,112 @@ class ControllerMethodResolver {
private
final
Map
<
Class
<?>,
SessionAttributesHandler
>
sessionAttributesHandlerCache
=
new
ConcurrentHashMap
<>(
64
);
ControllerMethodResolver
(
ArgumentResolverConfigurer
argumentResolvers
,
List
<
HttpMessageReader
<?>>
messageReaders
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
)
{
ControllerMethodResolver
(
ArgumentResolverConfigurer
customResolvers
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
,
List
<
HttpMessageReader
<?>>
readers
)
{
Assert
.
notNull
(
argument
Resolvers
,
"ArgumentResolverConfigurer is required"
);
Assert
.
notNull
(
messageR
eaders
,
"'messageReaders' is required"
);
Assert
.
notNull
(
custom
Resolvers
,
"ArgumentResolverConfigurer is required"
);
Assert
.
notNull
(
r
eaders
,
"'messageReaders' is required"
);
Assert
.
notNull
(
reactiveRegistry
,
"ReactiveAdapterRegistry is required"
);
Assert
.
notNull
(
context
,
"ApplicationContext is required"
);
ArgumentResolverRegistrar
registrar
;
this
.
initBinderResolvers
=
initBinderResolvers
(
customResolvers
,
reactiveRegistry
,
context
);
this
.
modelAttributeResolvers
=
modelMethodResolvers
(
customResolvers
,
reactiveRegistry
,
context
);
this
.
requestMappingResolvers
=
requestMappingResolvers
(
customResolvers
,
reactiveRegistry
,
context
,
readers
);
this
.
exceptionHandlerResolvers
=
exceptionHandlerResolvers
(
customResolvers
,
reactiveRegistry
,
context
);
this
.
reactiveAdapterRegistry
=
reactiveRegistry
;
registrar
=
ArgumentResolverRegistrar
.
configurer
(
argumentResolvers
).
basic
();
addResolversTo
(
registrar
,
reactiveRegistry
,
context
);
this
.
initBinderResolvers
=
registrar
.
getSyncResolvers
();
initControllerAdviceCaches
(
context
);
}
registrar
=
ArgumentResolverRegistrar
.
configurer
(
argumentResolvers
).
modelAttributeSupport
();
addResolversTo
(
registrar
,
reactiveRegistry
,
context
);
this
.
modelAttributeResolvers
=
registrar
.
getResolvers
();
private
List
<
SyncHandlerMethodArgumentResolver
>
initBinderResolvers
(
ArgumentResolverConfigurer
customResolvers
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
)
{
registrar
=
ArgumentResolverRegistrar
.
configurer
(
argumentResolvers
).
fullSupport
(
messageReaders
);
addResolversTo
(
registrar
,
reactiveRegistry
,
context
);
this
.
requestMappingResolvers
=
registrar
.
getResolvers
();
return
initResolvers
(
customResolvers
,
reactiveRegistry
,
context
,
false
,
Collections
.
emptyList
()).
stream
()
.
filter
(
resolver
->
resolver
instanceof
SyncHandlerMethodArgumentResolver
)
.
map
(
resolver
->
(
SyncHandlerMethodArgumentResolver
)
resolver
)
.
collect
(
Collectors
.
toList
());
}
registrar
=
ArgumentResolverRegistrar
.
configurer
(
argumentResolvers
).
basic
();
addResolversTo
(
registrar
,
reactiveRegistry
,
context
);
this
.
exceptionHandlerResolvers
=
registrar
.
getResolvers
();
private
static
List
<
HandlerMethodArgumentResolver
>
modelMethodResolvers
(
ArgumentResolverConfigurer
customResolvers
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
)
{
this
.
reactiveAdapterRegistry
=
reactiveRegistry
;
return
initResolvers
(
customResolvers
,
reactiveRegistry
,
context
,
true
,
Collections
.
emptyList
());
}
initControllerAdviceCaches
(
context
);
private
static
List
<
HandlerMethodArgumentResolver
>
requestMappingResolvers
(
ArgumentResolverConfigurer
customResolvers
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
,
List
<
HttpMessageReader
<?>>
readers
)
{
return
initResolvers
(
customResolvers
,
reactiveRegistry
,
context
,
true
,
readers
);
}
private
static
List
<
HandlerMethodArgumentResolver
>
exceptionHandlerResolvers
(
ArgumentResolverConfigurer
customResolvers
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
)
{
return
initResolvers
(
customResolvers
,
reactiveRegistry
,
context
,
false
,
Collections
.
emptyList
());
}
private
void
addResolversTo
(
ArgumentResolverRegistrar
registrar
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
)
{
private
static
List
<
HandlerMethodArgumentResolver
>
initResolvers
(
ArgumentResolverConfigurer
customResolvers
,
ReactiveAdapterRegistry
reactiveRegistry
,
ConfigurableApplicationContext
context
,
boolean
supportDataBinding
,
List
<
HttpMessageReader
<?>>
readers
)
{
ConfigurableListableBeanFactory
beanFactory
=
context
.
getBeanFactory
();
boolean
requestMappingMethod
=
!
readers
.
isEmpty
()
&&
supportDataBinding
;
// Annotation-based...
registrar
.
add
(
new
RequestParamMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
,
false
));
registrar
.
add
(
new
RequestParamMapMethodArgumentResolver
(
reactiveRegistry
));
registrar
.
add
(
new
PathVariableMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
registrar
.
add
(
new
PathVariableMapMethodArgumentResolver
(
reactiveRegistry
));
registrar
.
add
(
new
MatrixVariableMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
registrar
.
add
(
new
MatrixVariableMapMethodArgumentResolver
(
reactiveRegistry
));
registrar
.
addIfRequestBody
(
readers
->
new
RequestBodyArgumentResolver
(
readers
,
reactiveRegistry
));
registrar
.
addIfRequestBody
(
readers
->
new
RequestPartMethodArgumentResolver
(
readers
,
reactiveRegistry
));
registrar
.
addIfModelAttribute
(()
->
new
ModelAttributeMethodArgumentResolver
(
reactiveRegistry
,
false
));
registrar
.
add
(
new
RequestHeaderMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
registrar
.
add
(
new
RequestHeaderMapMethodArgumentResolver
(
reactiveRegistry
));
registrar
.
add
(
new
CookieValueMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
registrar
.
add
(
new
ExpressionValueMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
registrar
.
add
(
new
SessionAttributeMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
registrar
.
add
(
new
RequestAttributeMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
List
<
HandlerMethodArgumentResolver
>
result
=
new
ArrayList
<>();
result
.
add
(
new
RequestParamMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
,
false
));
result
.
add
(
new
RequestParamMapMethodArgumentResolver
(
reactiveRegistry
));
result
.
add
(
new
PathVariableMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
result
.
add
(
new
PathVariableMapMethodArgumentResolver
(
reactiveRegistry
));
result
.
add
(
new
MatrixVariableMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
result
.
add
(
new
MatrixVariableMapMethodArgumentResolver
(
reactiveRegistry
));
if
(!
readers
.
isEmpty
())
{
result
.
add
(
new
RequestBodyArgumentResolver
(
readers
,
reactiveRegistry
));
result
.
add
(
new
RequestPartMethodArgumentResolver
(
readers
,
reactiveRegistry
));
}
if
(
supportDataBinding
)
{
result
.
add
(
new
ModelAttributeMethodArgumentResolver
(
reactiveRegistry
,
false
));
}
result
.
add
(
new
RequestHeaderMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
result
.
add
(
new
RequestHeaderMapMethodArgumentResolver
(
reactiveRegistry
));
result
.
add
(
new
CookieValueMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
result
.
add
(
new
ExpressionValueMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
result
.
add
(
new
SessionAttributeMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
result
.
add
(
new
RequestAttributeMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
));
// Type-based...
registrar
.
addIfRequestBody
(
readers
->
new
HttpEntityArgumentResolver
(
readers
,
reactiveRegistry
));
registrar
.
add
(
new
ModelArgumentResolver
(
reactiveRegistry
));
registrar
.
addIfModelAttribute
(()
->
new
ErrorsMethodArgumentResolver
(
reactiveRegistry
));
registrar
.
add
(
new
ServerWebExchangeArgumentResolver
(
reactiveRegistry
));
registrar
.
add
(
new
PrincipalArgumentResolver
(
reactiveRegistry
));
registrar
.
addIfRequestBody
(
readers
->
new
SessionStatusMethodArgumentResolver
());
registrar
.
add
(
new
WebSessionArgumentResolver
(
reactiveRegistry
));
if
(!
readers
.
isEmpty
())
{
result
.
add
(
new
HttpEntityArgumentResolver
(
readers
,
reactiveRegistry
));
}
result
.
add
(
new
ModelArgumentResolver
(
reactiveRegistry
));
if
(
supportDataBinding
)
{
result
.
add
(
new
ErrorsMethodArgumentResolver
(
reactiveRegistry
));
}
result
.
add
(
new
ServerWebExchangeArgumentResolver
(
reactiveRegistry
));
result
.
add
(
new
PrincipalArgumentResolver
(
reactiveRegistry
));
if
(
requestMappingMethod
)
{
result
.
add
(
new
SessionStatusMethodArgumentResolver
());
}
result
.
add
(
new
WebSessionArgumentResolver
(
reactiveRegistry
));
// Custom...
re
gistrar
.
addCustomResolvers
(
);
re
sult
.
addAll
(
customResolvers
.
getCustomResolvers
()
);
// Catch-all...
registrar
.
add
(
new
RequestParamMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
,
true
));
registrar
.
addIfModelAttribute
(()
->
new
ModelAttributeMethodArgumentResolver
(
reactiveRegistry
,
true
));
result
.
add
(
new
RequestParamMethodArgumentResolver
(
beanFactory
,
reactiveRegistry
,
true
));
if
(
supportDataBinding
)
{
result
.
add
(
new
ModelAttributeMethodArgumentResolver
(
reactiveRegistry
,
true
));
}
return
result
;
}
private
void
initControllerAdviceCaches
(
@Nullable
ApplicationContext
applicationContext
)
{
if
(
applicationContext
==
null
)
{
return
;
}
private
void
initControllerAdviceCaches
(
ApplicationContext
applicationContext
)
{
if
(
logger
.
isInfoEnabled
())
{
logger
.
info
(
"Looking for @ControllerAdvice: "
+
applicationContext
);
}
...
...
@@ -354,84 +382,4 @@ class ControllerMethodResolver {
(
AnnotationUtils
.
findAnnotation
(
method
,
RequestMapping
.
class
)
==
null
)
&&
(
AnnotationUtils
.
findAnnotation
(
method
,
ModelAttribute
.
class
)
!=
null
);
private
static
class
ArgumentResolverRegistrar
{
private
final
List
<
HandlerMethodArgumentResolver
>
customResolvers
;
private
final
List
<
HttpMessageReader
<?>>
messageReaders
;
private
final
boolean
modelAttributeSupported
;
private
final
List
<
HandlerMethodArgumentResolver
>
result
=
new
ArrayList
<>();
private
ArgumentResolverRegistrar
(
ArgumentResolverConfigurer
resolvers
,
List
<
HttpMessageReader
<?>>
messageReaders
,
boolean
modelAttribute
)
{
this
.
customResolvers
=
resolvers
.
getCustomResolvers
();
this
.
messageReaders
=
messageReaders
;
this
.
modelAttributeSupported
=
modelAttribute
;
}
public
void
add
(
HandlerMethodArgumentResolver
resolver
)
{
this
.
result
.
add
(
resolver
);
}
public
void
addIfRequestBody
(
Function
<
List
<
HttpMessageReader
<?>>,
HandlerMethodArgumentResolver
>
function
)
{
if
(!
CollectionUtils
.
isEmpty
(
this
.
messageReaders
))
{
add
(
function
.
apply
(
this
.
messageReaders
));
}
}
public
void
addIfModelAttribute
(
Supplier
<
HandlerMethodArgumentResolver
>
supplier
)
{
if
(
this
.
modelAttributeSupported
)
{
add
(
supplier
.
get
());
}
}
public
void
addCustomResolvers
()
{
this
.
customResolvers
.
forEach
(
this
::
add
);
}
public
List
<
HandlerMethodArgumentResolver
>
getResolvers
()
{
return
this
.
result
;
}
public
List
<
SyncHandlerMethodArgumentResolver
>
getSyncResolvers
()
{
return
this
.
result
.
stream
()
.
filter
(
resolver
->
resolver
instanceof
SyncHandlerMethodArgumentResolver
)
.
map
(
resolver
->
(
SyncHandlerMethodArgumentResolver
)
resolver
)
.
collect
(
Collectors
.
toList
());
}
public
static
Builder
configurer
(
ArgumentResolverConfigurer
configurer
)
{
return
new
Builder
(
configurer
);
}
public
static
class
Builder
{
private
final
ArgumentResolverConfigurer
resolvers
;
public
Builder
(
ArgumentResolverConfigurer
configurer
)
{
this
.
resolvers
=
configurer
;
}
public
ArgumentResolverRegistrar
fullSupport
(
List
<
HttpMessageReader
<?>>
httpMessageReaders
)
{
return
new
ArgumentResolverRegistrar
(
this
.
resolvers
,
httpMessageReaders
,
true
);
}
public
ArgumentResolverRegistrar
modelAttributeSupport
()
{
return
new
ArgumentResolverRegistrar
(
this
.
resolvers
,
Collections
.
emptyList
(),
true
);
}
public
ArgumentResolverRegistrar
basic
()
{
return
new
ArgumentResolverRegistrar
(
this
.
resolvers
,
Collections
.
emptyList
(),
false
);
}
}
}
}
spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/RequestMappingHandlerAdapter.java
浏览文件 @
18854ee5
...
...
@@ -170,7 +170,7 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Application
}
this
.
methodResolver
=
new
ControllerMethodResolver
(
this
.
argumentResolverConfigurer
,
this
.
messageReaders
,
this
.
reactiveAdapterRegistry
,
this
.
applicationContext
);
this
.
reactiveAdapterRegistry
,
this
.
applicationContext
,
this
.
messageReaders
);
this
.
modelInitializer
=
new
ModelInitializer
(
this
.
methodResolver
,
this
.
reactiveAdapterRegistry
);
}
...
...
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolverTests.java
浏览文件 @
18854ee5
...
...
@@ -76,7 +76,7 @@ public class ControllerMethodResolverTests {
applicationContext
.
refresh
();
this
.
methodResolver
=
new
ControllerMethodResolver
(
resolvers
,
codecs
.
getReaders
(),
ReactiveAdapterRegistry
.
getSharedInstance
(),
applicationContext
);
resolvers
,
ReactiveAdapterRegistry
.
getSharedInstance
(),
applicationContext
,
codecs
.
getReaders
()
);
Method
method
=
ResolvableMethod
.
on
(
TestController
.
class
).
mockCall
(
TestController:
:
handle
).
method
();
this
.
handlerMethod
=
new
HandlerMethod
(
new
TestController
(),
method
);
...
...
spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/ModelInitializerTests.java
浏览文件 @
18854ee5
...
...
@@ -79,7 +79,7 @@ public class ModelInitializerTests {
resolverConfigurer
.
addCustomResolver
(
new
ModelArgumentResolver
(
adapterRegistry
));
ControllerMethodResolver
methodResolver
=
new
ControllerMethodResolver
(
resolverConfigurer
,
Collections
.
emptyList
(),
adapterRegistry
,
new
StaticApplicationContex
t
());
resolverConfigurer
,
adapterRegistry
,
new
StaticApplicationContext
(),
Collections
.
emptyLis
t
());
this
.
modelInitializer
=
new
ModelInitializer
(
methodResolver
,
adapterRegistry
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录