在Spring框架中,有两个非常常用的注解:@Validated和@Valid。这两个注解都可以用来验证Bean对象的属性。不过它们之间有一些不同,这篇文章将详细介绍它们的用法、区别等。
1. @Validated注解
@Validated注解是Spring框架提供的验证注解,它在Bean对象中可以用来验证属性值是否符合规范。在Spring MVC中,我们通常会在Controller层使用它来验证请求参数是否合法。@Validated注解可以用于方法级别和类型级别(类级别)。具体的用法如下:
(1)方法级别
在方法上使用@Validated注解,用来验证方法参数:
@RestController
public class UserController {
@PostMapping("/user")
public void createUser(@Validated @RequestBody User user) {
// ...
}
}
(2)类型级别
在类上使用@Validated,用来验证在该类中所有的属性:
@Validated
@Data
public class User {
@NotNull(message = "用户名不能为空")
private String name;
@NotNull(message = "密码不能为空")
private String password;
}
2. @Valid注解
@Valid注解是Java Bean Validation(JSR303)提供的验证注解,用来验证Bean的属性值是否符合规范。具体的用法如下:
@RestController
public class UserController {
@PostMapping("/user")
public void createUser(@Valid @RequestBody User user) {
// ...
}
}
这里的@Valid注解只能用在方法参数上,并且会校验该参数的所有成员变量。
@NotNull :被注解的元素必须不为null
@NotBlank注解 :验证注解的元素值不为空(不为null、去除首位空格后长度为0) ,并且类型为String。
@NotEmpty注解 :验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) ,并且类型为String。
@AssertTrue注解 :被注解的元素必须为true,并且类型为boolean。
@AssertFalse注解 :被注解的元素必须为false,并且类型为boolean。
@Min注解 :被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double。
@Max注解:被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double。
@DecimalMin注解 :验证注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal。
@DecimalMax注解 :验证注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal。
@Range注解 :验证注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,byte,short,int,long。
@Past注解 :被注解的元素必须为过去的一个时间,并且类型为java.util.Date。
@Future注解 :被注解的元素必须为未来的一个时间,并且类型为java.util.Date。
@Size注解 :被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map。
@Length注解 :验证注解的元素值长度在min和max区间内 ,并且类型为String。
@Digits注解 :验证注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。
@Pattern注解 :被注解的元素必须符合指定的正则表达式,并且类型为String。
@Email注解: 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String。
3. 区别
区别主要有以下几个方面:
(1)@Validated注解是Spring框架提供的注解,而@Valid注解是Java Bean Validation(JSR303)提供的注解。
(2)@Validated注解可以用于方法级别和类型级别,@Valid注解只用于方法参数。
(3)@Validated注解是Spring框架的一部分,可以跟Spring框架结合使用实现一些特定功能,如:@PathVariable、@RequestParam、@RequestBody验证等。
(4)@Validated注解只能对Spring容器中的Bean进行验证,而@Valid注解可以对任意的对象进行验证。
总结:@Validated和@Valid注解虽然都是用于验证Bean对象的属性值是否符合规范,但是@Validated更具可定制化,可以更好的与Spring框架进行结合使用。而@Valid注解则是Java Bean Validation(JSR303)标准的一部分,在验证非Spring容器管理的Bean对象时更为便利。