Spring MVC中不加@RequestParam也能实现参数绑定的原理是什么?
错误原因
给方法参数加@RequestParam时,Spring会默认匹配与方法参数名同名的单个请求参数,也就是会查找请求中是否存在名为shoebox的参数,你请求中只传了color和size,自然匹配不到,就会抛出400缺失参数的错误,这部分你的理解是正确的。
无注解自动绑定的实现逻辑
对于Controller方法中没有添加任何参数注解的自定义POJO类型(非String、基础类型及其包装类等Spring默认支持的简单类型),Spring会自动采用ServletModelAttributeMethodProcessor处理参数,走POJO属性绑定逻辑:
- 首先实例化对应POJO类(这里为
ShoeBox)的空对象 - 遍历所有请求查询参数/表单参数,按照参数名和POJO的属性名做匹配,通过属性对应的setter方法将参数值注入到POJO实例中
- 自动完成类型转换,比如将请求传递的字符串参数转换为POJO属性对应的枚举、数值等类型,只要转换规则匹配即可完成赋值
你传递的color、size参数正好和ShoeBox类的属性名匹配,因此可以完成自动绑定。
官方说明
Spring官方文档中明确规定:未添加任何参数注解的POJO类型方法参数,会被默认标记为@ModelAttribute,走模型属性绑定流程,将请求参数和POJO属性做自动映射。
如果需要显式标注该绑定逻辑,也可以主动给POJO参数添加@ModelAttribute注解,效果和无注解完全一致:
@GetMapping("/shoebox") public ResponseEntity<?> find(@ModelAttribute ShoeBox shoebox) { ... }
内容的提问来源于stack exchange,提问作者secondbreakfast
相关产品推荐
相关产品推荐

