码迷,mamicode.com
首页 > 编程语言 > 详细

Spring HandlerMethodArgumentResolver

时间:2019-04-27 17:02:06      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:dal   ssi   map   lis   str   break   als   cto   @Value   

Spring 4.3.2

Spring请求的参数会经过HandlerMethodArgumentResolver的转换,接口HandlerMethodArgumentResolver定义了两个方法

boolean supportsParameter(MethodParameter parameter); 

Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;

当supportsParameter返回true时会调用resolveArgument转换参数

源代码如下org.springframework.web.method.support.HandlerMethodArgumentResolverComposite

 1 private HandlerMethodArgumentResolver getArgumentResolver(MethodParameter parameter) {
 2    HandlerMethodArgumentResolver result = this.argumentResolverCache.get(parameter);
 3    if (result == null) {
 4        for (HandlerMethodArgumentResolver methodArgumentResolver : this.argumentResolvers) {
 5           if (logger.isTraceEnabled()) {
 6              logger.trace("Testing if argument resolver [" + methodArgumentResolver + "] supports [" +
 7                 parameter.getGenericParameterType() + "]");
 8           }
 9           if (methodArgumentResolver.supportsParameter(parameter)) {
10              result = methodArgumentResolver;
11              this.argumentResolverCache.put(parameter, result);
12              break;
13           }
14        }
15    }
16    return result;
17 }

默认有26个实现HandlerMethodArgumentResolver的类,在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter中添加

源代码如下

注释是HandlerMethodArgumentResolver处理的参数类型,?代表还未看懂的

 1 private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
 2         List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();
 3 
 4         // Annotation-based argument resolution
 5         resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false)); // @RequestParam
 6         resolvers.add(new RequestParamMapMethodArgumentResolver()); // @RequestParam Map [Map | MultiValueMap]
 7         resolvers.add(new PathVariableMethodArgumentResolver()); // @PathVariable
 8         resolvers.add(new PathVariableMapMethodArgumentResolver()); // @PathVariable Map
 9         resolvers.add(new MatrixVariableMethodArgumentResolver()); // @MatrixVariable
10         resolvers.add(new MatrixVariableMapMethodArgumentResolver()); // @MatrixVariable Map
11         resolvers.add(new ServletModelAttributeMethodProcessor(false)); // @ModelAttribute | ?
12         resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); // @RequestBody
13         resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice)); // @RequestPart | ?
14         resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory())); // @RequestHeader
15         resolvers.add(new RequestHeaderMapMethodArgumentResolver()); // @RequestHeader Map
16         resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory())); // @CookieValue
17         resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory())); // @Value
18         resolvers.add(new SessionAttributeMethodArgumentResolver()); // @SessionAttribute
19         resolvers.add(new RequestAttributeMethodArgumentResolver()); // @RequestAttribute
20 
21         // Type-based argument resolution
22         resolvers.add(new ServletRequestMethodArgumentResolver()); // WebRequest...
23         resolvers.add(new ServletResponseMethodArgumentResolver()); // ServletResponse | OutputStream | Writer
24         resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice)); // HttpEntity | RequestEntity
25         resolvers.add(new RedirectAttributesMethodArgumentResolver()); // RedirectAttributes
26         resolvers.add(new ModelMethodProcessor()); // Model
27         resolvers.add(new MapMethodProcessor()); // Map
28         resolvers.add(new ErrorsMethodArgumentResolver()); // Errors
29         resolvers.add(new SessionStatusMethodArgumentResolver()); // SessionStatus
30         resolvers.add(new UriComponentsBuilderMethodArgumentResolver()); // UriComponentBuilder | ServletUriComponentBuilder
31 
32         // Custom arguments
33         if (getCustomArgumentResolvers() != null) {
34             resolvers.addAll(getCustomArgumentResolvers()); // 自定义
35         }
36 
37         // Catch-all
38         resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true)); // 普通类型
39         resolvers.add(new ServletModelAttributeMethodProcessor(true)); // 普通类型
40 
41         return resolvers;
42     }

 

Spring HandlerMethodArgumentResolver

标签:dal   ssi   map   lis   str   break   als   cto   @Value   

原文地址:https://www.cnblogs.com/kwpsz/p/10779305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!