SpringBoot关于@RequestBody请求参数

一.Post请求中Dto参数带@RequestBody

方法代码:

    @PostMapping("/test")
    public UserDto getUserParam(
            @RequestParam String myName,
            @RequestHeader(value = "token", required = false) String token,
            @RequestAttribute(value = "attr", required = false) String attr,
            @RequestBody UserDto userDto
    )

1.PostMan请求(Body不写任何东西):

请求结果:

结果返回报错,

我们看下源码,

1.【RequestResponseBodyMethodProcessor 类参数解析器方法来处理,循环默认的10种消息转换器,找到当前参数类型进行解析

2.这里注意@RequestBody类型参数会用 MappingJackson2HttpMessageConverter 这个消息转换器,

3.判断当前类型无法解析当前参数,返回null,判断为空并且参数是必填的,就会抛出异常

2.PostMan请求(Body只写 {}):

请求结果:

结果返回成功,

我们看下源码,

1.经过消息解析器返回的结果不是null,只不过dto内部属性都是空的,但是并不会报错

二.Post请求中Dto参数不带@RequestBody

方法代码:

   @PostMapping("/test")
    public UserDto getUserParam(
            @RequestParam String myName,
            @RequestHeader(value = "token", required = false) String token,
            @RequestAttribute(value = "attr", required = false) String attr,
            UserDto userDto
    ) 

1.PostMan请求(Body不写任何东西或者写参数信息):

请求结果:

返回结果不报错,但是也没有赋值成功

2.PostMan请求(dto参数写到param参数):

请求结果:

返回结果成功,赋值成功

我们看下源码,

1.【ModelAttributeMethodProcessor 类参数解析器方法来处理,获取请求中所有以param类型的参数,找到当前dto进行解析,如果找到和dto属性的参数名称一样就赋值

总结:

1.dto实体类型的参数,标注@RequestBody(Default Required=true)注解时,Servlet一定会读取发送的Body体中的json参数,

(1)Body体中什么都不传,返回会报错

(2)Body体中传{},返回不会报错,解析结果是属性为null的dto

(3)Body体中传错误参数的{"a":1},返回不会报错,解析结果是属性为null的dto

(4)【RequestResponseBodyMethodProcessor 类参数解析器】解析参数

2.dto实体类型的参数,什么注解都不标,Servlet会去读取发送的Param类似url?传参的参数

(1)Body体中什么都不传或者传{},返回不会报错,解析结果是属性为null的dto

(2)Param类似url?传参,返回才会成功,解析结果才会成功

(3)【ModelAttributeMethodProcessor 类参数解析器】解析参数

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值