应用场景:假如我们新增用户信息,用户的用户名和密码不能为空,我不想写if/else进行判断,这个时候就可以用javax的validation来做。
javax的校验机制是基于标准JSR-303规范()。
hibernate是扩展了javax的接口
但是java只提供了接口,需要我们自己来写校验规则。
好在hibernate为我们提供了一些校验规则。我们可以直接拿来用。
Validator
参考下面这个博客:给我们介绍了如何使用。还有如何自定义注解来验证参数。
https://blog.csdn.net/dream_broken/article/details/53584169
@Valid
但是其实在Spring管理的项目,用不着这么麻烦,因为Spring有@Valid注解可以在classpath下有Hibernate Validator时自动触发校验.并且支持校验 javax和hibernate 的注解. 还能把验证结果绑定在BindingResult类上.我们可以拿到校验结果去做自定义处理,或者直接抛出NPE.
如果你想更多地了解Spring是如何处理@Valid注解的话,可以看看这个stackOverFlow上的问题
https://stackoverflow.com/questions/3595160/what-does-the-valid-annotation-indicate-in-spring
关于@Valid的简单入门使用可以参考:
https://blog.csdn.net/FU250/article/details/80247930
@Validated
但是我还发现 Spring除了提供@Valid之外,还会提供@Validated注解.原理是通过切面( MethodValidationPostProcessor.)来扫描所有的@Valid注解
这2个注解大多数功能都是重复的但是还是有略微的区别.
这里先说下不同点:
- 分组
- 注解地方,@Valid可以注解在成员属性(字段)上,但是@Validated不行
- 由于第2点的不同,将导致@Validated不能做嵌套校验
- @valid只能用在controller。@Validated可以用在其他被spring管理的类上。
可以参考:7. Spring3.1支持方法级别验证
这种用法@Validated注解只能打在类上。
这里存在的问题是:@Validated和@Transactional同时打在类上,会优先执行@Transactional,但是更合理的是优先验证参数。这就需要更改代理类上的拦截器的顺序
注意 @Valid和@Validated都只能用在controller层。