SpringBoot关于@RequestBody请求参数
一.Post请求中Dto参数带@RequestBody方法代码:@PostMapping("/test")public UserDto getUserParam(@RequestParam String myName,@RequestHeader(value = "token", required = false) String token,@RequestAttribute(value = "a
一.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 类参数解析器】解析参数
更多推荐
所有评论(0)