@Validated和@Valid的区别?校验级联属性(内部类)
每篇一句
NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术
相关阅读
【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例
【小家Spring】让Controller支持对平铺参数执行数据校验(默认Spring MVC使用@Valid只能对JavaBean进行校验)
【小家Spring】Spring方法级别数据校验:@Validated + MethodValidationPostProcessor优雅的完成数据校验动作
前言
上篇文章 介绍了Spring
环境下实现优雅的方法级别的数据校验,并且埋下一个伏笔:它在Spring MVC
(Controller
层)里怎么应用呢?本文为此继续展开讲解Spring MVC
中的数据校验~
可能小伙伴能立马想到:这不一样吗?我们使用Controller
就是方法级别的,所以它就是直接应用了方法级别的校验而已嘛~对于此疑问我先不解答,而是顺势再抛出两个问题你自己应该就能想明白了:
- 上文有说过,基于方法级别的校验
Spring
默认是并未开启
的,但是为什么你在Spring MVC
却可以直接使用@Valid
完成校验呢?- 可能有的小伙伴说他用的是
SpringBoot
可能默认给开启了,其实不然。哪怕你用的传统Spring MVC
你会发现也是直接可用的,不信你就试试
- 可能有的小伙伴说他用的是
- 类比一下:
Spring MVC
的HandlerInterceptor
是AOP
思想的实现,但你有没有发现即使你没有启动@EnableAspectJAutoProxy
的支持,它依旧好使~
若你能想明白我提出的这两个问题,下文就非常不难理解了。当然即使你知道了这两个问题的答案,还是建议你读下去。毕竟:永远相信本文能给你带来意想不到的收获~
使用示例
关于数据校验这一块在Spring MVC
中的使用案例,我相信但凡有点经验的Java程序员应该没有不会使用的,并且还不乏熟练的选手。在此之前我简单“采访”
过,绝大多数程序员甚至一度认为Spring中的数据校验就是指的在Controller
中使用@Validated
校验入参JavaBean
这一块~
因此下面这个例子,你应该一点都不陌生:
@Getter @Setter @ToString public class Person { @NotNull private String name; @NotNull @Positive private Integer age; @Valid // 让InnerChild的属性也参与校验 @NotNull private InnerChild child; @Getter @Setter @ToString public static class InnerChild { @NotNull private String name; @NotNull @Positive