遗留痛点
你是否发现,虽然Spring MVC给我们提供了极其方便的数据校验方式,但是它还是有比较大的局限性的:它要求待校验的入参是JavaBean
请注意:并不一样要求是请求Body体哦,比如get请求的入参若用JavaBean接收的话,依旧能启用校验
但在实际应用中,其实我们非常多的Controller方法的方法入参是平铺的,也就是所谓的平铺参数,形如这样:
@PutMapping("/hello/id/{id}/status/{status}") public Object helloGet(@PathVariable Integer id, @PathVariable Integer status) { ... return "hello world"; }
其实,特别是get请求的case,@RequestParam入参一般是非常多的(比如分页查询),难道对于这种平铺参数的case,我们真的是能通过人肉if else的去校验吗?
兴许你对此问题有兴趣,那就参阅本文吧,它能给你提供解决方案:【小家Spring】让Controller支持对平铺参数执行数据校验(默认Spring MVC使用@Valid只能对JavaBean进行校验)
@Validated和@Valid的区别
如题的问题,我相信是很多小伙伴都很关心的一个对比,若你把这个系列都有喵过,那么这个问题的答案就浮出水面了:
- @Valid:标准JSR-303规范的标记型注解,用来标记验证属性和方法返回值,进行级联和递归校验
- @Validated:Spring的注解,是标准JSR-303的一个变种(补充),提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
- 在Controller中校验方法参数时,使用@Valid和@Validated并无特殊差异(若不需要分组校验的话)
- @Validated注解可以用于类级别,用于支持Spring进行方法级别的参数校验。@Valid可以用在属性级别约束,用来表示级联校验。
- @Validated只能用在类、方法和参数上,而@Valid可用于方法、字段、构造器和参数上
最后提示一点:Spring Boot的Web Starter已经加入了Bean Validation以及实现的依赖,可以直接使用。但若是纯Spring MVC环境,请自行导入~
总结
本文介绍的是我们平时使用得最多的数据校验场景:使用@Validated完成Controller的入参校验,实现优雅的处理数据校验。同时希望通过本文能让你彻底弄懂@Validated和@Valid使用上的区别以及联系,在实际生产使用中能够做到更加的得心应手~