一.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 类参数解析器】解析参数

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐