Spring MVC的参数解析器【一】

随笔

Spring MVC的参数解析器

概要

  • 以form表单的形式传入数据,不论你传的是deviceId[0]=1,还是deviceId=1,2,3,又或者是直接传入dto.id=123456这样的,都能在后台准确的接收到,这是为什么?

环境

springBoot2.5.5+web环境

实体类自定义

代码开始

  • 首先我们看到的是

    postman表单请求

    它是能够成功接收到的

  • 现在开始看看源码是怎么处理这些的,这么智能

    从RequestMappingHandlerAdapter的invokeHandlerMethod方法开始,这个就是将request中的数据解析出来的源头

第一步

  • 继续进去看看怎么解析的

第二步

  • 看看映射具体操作
    第三步
    第四步

    这个就比较熟悉了,看到了HandlerMethodArgumentResolve接口的方法,一个判断是否支持,一个执行参数解析

    我们直接看执行参数解析吧
    第五步
    第六步

    可以看到attribute的类型是我们controller的方法参数,然后就到了bind里面了,所以关注bind的属性值变化,发现过了蓝色那块的代码之后,它有值了,所以,进去看看
    第七步

    前面都没有改变bind的属性值,那么只能是最后一行了,进去看看
    第八步
    第九步

    看this里面知道,还是在最后一行,继续
    第十步
    继续
    第十一步

    继续
    第十二步

    for循环key值,然后处理
    第十三步
    第十四步
    这个估计就是标记的作用,可以看看后面

    运行出来之后就到了这
    第十五步
    第十六步

    这个方法的主要功能是把deviceId[0]这样的参数封装成一个对象PropertyTokenHolder
    第十七步
    第十八步

    进入setproperty
    第十九步

    继续
    第二十步

    我传了两个deviceId[]的格式,现在看看deviceId[1],直接跳到setProperty
    第二十一步

  • 上面的就是deviceId[0],deviceId[1]这些参数解析的操作

  • 下面看看deviceId=1,2,3,4这样的是怎么赋值的

    在上面的基础上,直接到setProperty
    第二十二步
    第二十三步

    spring 会拿到它的数据类型,然后将拿到的数据进行转换,然后赋值

  • 下面我们看看dto.xxx的效果
    第二十四步

    由于是有.,所以最终返回的就不是之前的-1了,而是返回数据.所在的位置
    第二十五步

    然后就是把数据封装,dto和xxx封装
    第二十六步

    值得注意的是,多了一个rootObject对象。后面的就变成对属性的子对象进行赋值了,所以步骤和正常的是一致的。

以上为我的个人见解,如有错误,烦请指出,不胜感激

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值