Java中的Valid和Validated的比较
如果要添加接口校验,需要
第一步,在接口方法或者类方法中请求参数前面添加@Valid(来自jakarta.validation-api-2.0.2里面的类)或者@Validated注解,也可以在接口的实现类上添加@Valid注解,但不需要@Validated注解,如果校验失败,会反馈到Errors类上面:
//Controller类中的方法 public RetMsg abc(@RequestBody @Valid AbcDTO receiver) {} public RetMsg abc(@RequestBody @Validated AbcDTO receiver) {} //接口中的方法 addAnimal(@Valid Animal a, Errors errors); addAnimal(@Validated List<Animal> list);
第二步,在请求对象类的每个要校验的字段上添加相应校验的注解就行,比如@NotEmpty(来自jakarta.validation-api-2.0.2),@Pattern(来自jakarta.validation-api-2.0.2),@Range(来自hibernate-validator-6.2.5.Final),不需要在类上添加@Validated注解:
public class Animal{ @NotEmpty @Pattern(regexp="^(en_US|zh_CN)$", message="只允许这两个值") private String name; //如果是整形要加非空校验 @NotNull @Min(0) @Max(200) private Integer age; }
Validated是Spring对javax.validation的Valid的扩展,添加了支持分组校验功能,但是不支持嵌套校验,可以忽略这个注解。
Valid支持嵌套校验,比如:
@Valid private List<Animal> list
JavaEE/JakartaEE依赖关系,由于包名称空间从javax.*
(JavaEE/jakartaie 8及更低)切换到jakarta.*
(Jakartae 9及更高),事情变得有点复杂。例如,javax.validation:validation-api
只使用javax.*
包命名空间,而jakarta.validation:jakarta.validation-api
在springboot2.0.x版本中使用javax.*
程序包命名空间,在springboot3.0.x版中才使用jakarta.*
命名空间。
在springboot3.0之前仍然使用javax.*
包名,您需要使用javax.validation:validation-api:2.0.1.Final
或jakarta.validation:jakarta.validation-api:2.0.2
,如我上面链接的依赖版本文档所示(我建议使用jakarta.validation:jakarta.validation-api:2.0.2
),或者下面这种:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>
您不应该使用jakarta.validation:jakarta.validation-api:3.0.2
,因为它使用了错误的包命名空间。您需要等待Spring Boot 3.0进行切换(但同样,如果您让{@32}管理您的依赖版本,就像您应该做的那样,那么您不需要担心这个问题)
注意:如果是springboot2.3.0版本以前,上面的配置就可以了,但是之后的版本要添加启动项依赖,不然接口校验不生效:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>3.0.1</version> </dependency>