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 @   ppjj  阅读(625)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2015-01-31 ex:0602-169 遇到不完整或无效的多字节字符,转换失败
点击右上角即可分享
微信分享提示