通俗的讲,两者在基本用法上一样,在使用上,分组校验用@Validated,嵌套校验用@Valid
区别 | @valid | @validate |
---|---|---|
提供者 | spring-boot-starter-web 里面,springboot 项目自带 | Spring 做得一个自定义注解,增强了分组功能 |
是否支持分组 | 不支持 | 支持,参数校验时,根据不同的分组采取不同的校验 |
使用位置 | 构造函数、方法、方法参数、成员属性 | 类、方法、方法参数,不能用于成员属性 |
嵌套校验 | 支持,因为可以在成员属性上使用 | 不支持 |
基本用法,其他自行百度
注解 | 验证的数据类型 | 备注 |
---|---|---|
Null | 任意类型 | 参数值必须是 Null |
NotNull | 任意类型 | 参数值必须不是 Null |
NotBlank | 只能作用于字符串 | 字符串不能为 null,而且字符串长度必须大于 0,至少包含一个非空字符串 |
NotEmpty | 字符串和数组集合等 | 参数值不能为 null,集合不能为空 (空字符串(“ ”)可以通过校验) |
准备,引入包时,如果是spring boot项目,不需要什么包,其他项目需要引入,具体如下:
<!--第一种方式导入校验依赖:使用springboot时,在org\springframework\spring-context\5.2.1.RELEASE\spring-context-5.2.1.RELEASE.jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--第二种方式导入校验依赖-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!--第三种方式导入校验依赖-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
展示:@Validated和@Valid注解主要是做入参校验,我们一般用在Controller上。当然,也可以用在其他地方,讲完一般再说。
实体类:字段属性上加上@NotEmpty等注解,嵌套的List上,必须加@Valid注解(和@Validated的区别就在这,这里用@Validated或者不用@Valid都不会嵌套校验)
Controller:@RequestBody和@Validated的顺序无关紧要,我看有的人说因为顺序校验不起作用,不然。
上面用@Validated或@Valid效果一样,但不是所有地方都可以平替,比如下面这个:(区别所在,@Validated不支持嵌套校验)
@Validated用于类、方法、参数的示例:
注意,类名上必须用@Validated。(@Valid不支持类上注解,区别所在)
注:这里把 @Validated 注解放在方法上或者是方法参数前都是可以的,@Validated 注解统一放在类上边省去了一个一个方法上或者入参上添加该注解,如下:
讲完一般用法,再讲一下别的,有时候需要在Service层的方法上做参数校验,应该怎么实现呢?
@Service
@Validated
public class PersonService {
public void validatePersonRequest(@Valid PersonRequest personRequest) {
// do something
}
}
@Validated 需要用在被Spring容器管理的类上。
一定一定不要忘记在类上加上 @Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。而且再次强调,此处@Validated注解不能替换为@Valid,因为@Valid不支持类上注解,区别所在。
@Validated的分组和自定义校验就不说了,用到了自行百度吧。
总结
1、@Validated是Spring对@Valid的包装,增加了分组校验,删除了嵌套校验
2、@Validated放在类名上,是一种标记,告诉Spring这个类要被校验,@Valid放在类上无效
3、@Validated在controller层的参数前和@Valid效果一样
4、在其他层的方法和参数前,最好使用@Valid,放在方法上,是对:方法返回的对象进行校验