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.Finaljakarta.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>

 

 

本文转自:https://www.5axxw.com/questions/content/vu0g2j

https://huaweicloud.csdn.net/63875480dacf622b8df8aedb.html?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-1-112118416-blog-128894079.235%5Ev38%5Epc_relevant_sort_base3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Eactivity-1-112118416-blog-128894079.235%5Ev38%5Epc_relevant_sort_base3&utm_relevant_index=1

posted @ 2021-01-31 18:34  ppjj  阅读(589)  评论(0编辑  收藏  举报