一、如果方法中参数为基本类型,则通过POST的表单或者GET参数会使用

RequestParamMethodArgumentResolver作为参数解析器进行转换。如果参数名和客户端传入的参数名不一样,则加入@RequestParam注解。
    @RequestMapping("/user")@ResponseBodypublic Map<String,Object> getUser(Integer id) throws Exception{log.info(" get user id:" + id);Map<String,Object> user = new HashMap<String,Object>();user.put("id",id );user.put("name","liming" );return  user;
//        return "liming";}

二、如果方法中参数为自定义对象,则通过POST的表单或者GET参数 不论是否加上@ModelAttribute,都会自动转换为对象。此时的resolver为

ServletModelAttributeMethodProcessor
ModelAttributeMethodProcessor
public boolean supportsParameter(MethodParameter parameter) {return (parameter.hasParameterAnnotation(ModelAttribute.class) ||(this.annotationNotRequired && !BeanUtils.isSimpleProperty(parameter.getParameterType())));}

ServletModelAttributeMethodProcessor.resolveArgument参数会先创建

WebDataBinder的实现类为ExtendedServletRequestDataBinder,
public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {Object attribute = null;BindingResult bindingResult = null;if (bindingResult == null) {// Bean property binding and validation;// skipped in case of binding failure on construction.WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);if (binder.getTarget() != null) {if (!mavContainer.isBindingDisabled(name)) {bindRequestParameters(binder, webRequest);}validateIfApplicable(binder, parameter);if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {throw new BindException(binder.getBindingResult());}}// Value type adaptation, also covering java.util.Optionalif (!parameter.getParameterType().isInstance(attribute)) {attribute = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);}bindingResult = binder.getBindingResult();}return attribute;}

然后会调用ServletModelAttributeMethodProcessor.bindRequestParameters将request中的表单或者GET参数数据,绑定到binder中。

ServletModelAttributeMethodProcessor
protected void bindRequestParameters(WebDataBinder binder, NativeWebRequest request) {ServletRequest servletRequest = request.getNativeRequest(ServletRequest.class);Assert.state(servletRequest != null, "No ServletRequest");ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder;servletBinder.bind(servletRequest);}

最终调用到ServletRequestDataBinder.binder首先将入参转换为MutablePropertyValues,然后映射到WebBinder中。

ServletRequestDataBinderpublic void bind(ServletRequest request) {MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);MultipartRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartRequest.class);if (multipartRequest != null) {bindMultipart(multipartRequest.getMultiFileMap(), mpvs);}addBindValues(mpvs, request);doBind(mpvs);}

spring mvc @ModelAttribute 基本类型 自定义对象解析流程相关推荐

  1. Spring MVC @ModelAttribute 数据绑定

    前言 示例未经验证 Spring MVC @ModelAttribute 数据绑定 通过 WebDataBinder 将 @RequestMapping 方法的参数与 request 进行数据绑定 W ...

  2. 详解Spring MVC请求参数类型,解决中文乱码问题,自定义类型转换器,Spring MVC相关注解

    #SpringMVC SpringMVC请求 简单类型 简单类型包括:基本类型,基本类型的包装类型,字符串 编写Controller @RequestMapping("/param" ...

  3. Spring MVC 解决日期类型动态绑定问题

    出处:http://www.cnblogs.com/crazy-fox/archive/2012/02/18/2357699.html ean 名为User,则在相同的包中存在UserEditor类可 ...

  4. Spring MVC Converter(类型转换器)详解

    Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型.开发者在实际应用中使用框架内置的类型 ...

  5. Spring mvc 内置编码过滤器原理解析

    在Spring mvc框架中是如何解决从页面传来的字符串的编码问题的呢? 下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter. web.xml 中 添加如下配 ...

  6. [Spring MVC] - @ModelAttribute使用

    在Spring MVC里,@ModelAttribute通常使用在Controller方法的参数注解中,用于解释model entity,但同时,也可以放在方法注解里. 如果把@ModelAttrib ...

  7. Spring MVC 响应数据、作用域对象

    紧耦方式完成响应: 使用:在单元方法的形参中声明request对象或者response对象,使用request对象完成转发,使用response对象完成直接响应或者重定向. 注意:使用这两种方式,单元 ...

  8. Spring MVC代码实例系列-06:Spring MVC配置Hibernate-Validator以及自定义校验注解

    超级通道 :Spring MVC代码实例系列-绪论 本章主要记录,如何在Spring MVC中添加Hibernate-Validator以及自定义校验注解.本章主要涉及的技术点有: javax.val ...

  9. Spring MVC @ModelAttribute 详解

    1.@ModelAttribute注释void返回值的方法 [java] view plaincopy print? @Controller public class HelloModelContro ...

最新文章

  1. 如何破解汽车-快速的速成课程
  2. 多模态为什么比单模态好?第一份严谨证明来了!
  3. SpannableString 设置一段文字中部分字体颜色
  4. Java静态内部类、匿名内部类、成员式内部类和局部内部类
  5. 宁宛 机器人_全文阅读 .007 忠犬机器人
  6. mysql 大于小于不可在一个不等式中同时写
  7. 通过手机号码编码传送信息的想法
  8. 树莓派 | 摄像头模块的使用方法
  9. 期货交易常用术语中英文对照表
  10. 华硕笔记本(GTX 1060显卡)安装Ubuntu16.04+Nvidia显卡驱动+Cuda8.0+cudnn6.0+ROS+Opencv3.2+Caffe+Tensorflow
  11. 算法提高 盾神与条状项链(静态链表)
  12. php计算跨月请假天数,计算请假天数JavaScript方法
  13. 如何在5个月内做出月入3万的业余项目
  14. java的h2是什么_什么是H2数据库
  15. 语义分割常用指标详解(附代码)
  16. 国际化(i18n)的js实现
  17. WPS设置Excel下拉选项
  18. 北理工计算机系裴教授,裴 炤
  19. 后序遍历链式二叉树(递归和非递归)
  20. 终于有人把 ZFS 文件系统讲明白了

热门文章

  1. BW对于SAP SD模块有哪些作用
  2. 修改SAP系统字段描述的方法
  3. 分摊、分配、定期重过账
  4. java 参数三点,java函数参数类型后添加三点的用法
  5. tomcat连接不上本地mysql_mysql连接不上tomcat
  6. python教程:实现延时回调普通函数的方法
  7. 【Python教程】 正则表达式 re模块中,反斜杠 “\“分割字符串的正确操作方法
  8. python列表多重赋值
  9. Python中递归的最大次数
  10. mysql model only_full_group_by_MySql版本问题sql_mode=only_full_group_by的完美解决方案