@Valid和@Validated的区别详解
创作时间:
作者:
@小白创作中心
@Valid和@Validated的区别详解
引用
CSDN
1.
https://m.blog.csdn.net/achandy/article/details/139096534
@Valid和@Validated
实际开发中,往往用户的输入是不可信的,不管是GRPC还是前端接口,都需要对参数进行校验。
对数据本身的校验
比如:正则校验、非空校验、取值范围、指定的枚举等数据校验
比如:数据唯一性,业务上的限制等
@Valid和@Validated区别
@Valid和@Validated是用于Spring框架中进行数据校验的注解。从原码分析:
1.来源
- @Validated:Spring框架的注解,JSR-303的javax.validation的变体。设计用于方便使用Spring的JSR-303的支持,但不是JSR-303特有的。
- @Valid:Java EE提供的标准注解,它是JSR 303规范的一部分,主要用于Hibernate Validation等场景。
2.注解位置
- @Validated:用在类、方法和方法参数
- @Valid:用在方法、构造函数、方法参数和成员属性(字段)
3.分组验证
- @Validated:支持
- @Valid:不支持
4.嵌套验证
- @Validated:不支持
- @Valid:支持
示例
1.分组验证
分组校验是为了在不同场景下对成员属性进行灵活校验。一般在新增/编辑时,会使用同一个dto作为入参。那么在两个场景下,id的校验就不同了。
- 在dto中新增接口作为分组, 字段添加分组注解
package com.donico.demo.domain.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@Accessors(chain = true)
public class UserDto {
public interface AddGroup {
}
public interface EditGroup {
}
@Min(value = 1, message = "不合法", groups = {EditGroup.class})
private Long id;
/**
* 用户名
*/
@NotBlank(message = "不能为空")
private String username;
/**
* 密码
*/
@NotBlank(message = "不能为空")
private String password;
}
2.controller增加参数注解, 指定启用分组
package com.donico.demo.controller;
import com.donico.demo.domain.dto.UserDto;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/demo")
public class DemoController {
/**
* 添加用户
*/
@PostMapping("/user-add")
public void userAdd(@RequestBody() @Validated UserDto userDto) {
// todo
}
/**
* 编辑用户
*/
@PostMapping("/user-edit")
public void userEdit(@RequestBody() @Validated({UserDto.EditGroup.class}) UserDto userDto) {
// todo
}
}
在控制器中的方法指定了校验分组,DTO中标注了校验注解的属性,如果未指定分组则针对该方法,校验不会生效。未显示指定groups的字段,默认归于javax.validation.groups包下的Default.class(默认组)@Validated的value不指定组时,只校验Default组的字段@Validated的value指定组时,只校验属于指定组的字段,属于Default组的字段不会被校验如现在的示例, userEdit想指定组和默认组都被校验,有两种方式:
- @Validated的value中加入默认组,如下:
import javax.validation.groups.Default;
@PostMapping("/user-edit")
public void userEdit(@RequestBody() @Validated({UserDto.AddGroup.class, Default.class}) UserDto userDto) {
// todo
}
2.EditGroup接口继承Default接口,如下:
public class UserDto {
public interface AddGroup {
}
public interface EditGroup extends Default {
}
}
2.嵌套验证
嵌套校验(Nested Validation) 指的是在验证Bean对象时,需要校验的属性是一个Bean对象,而这个子对象也有需要校验的属性。
示例:
UserDto的team属性是一个对象
package com.donico.demo.domain.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.Valid;
@Data
@Accessors(chain = true)
public class UserDto {
@Valid
private TeamDto team;
}
TeamDto
package com.donico.demo.domain.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class TeamDto {
/**
* 团队名称
*/
@NotBlank(message = "不能为空")
private String teamName;
/**
* 加入时间
*/
@NotNull(message = "不能为空")
private Long joinTime;
}
热门推荐
如何改善表达不清晰的问题:多方面因素及解决方法探讨
汽车玻璃胶印的去除方法及注意事项
开足马力绘就温暖民生画卷!鄂尔多斯市借力社会组织服务居民逾10万人次
MES系统里的报警分类
四色症:关于看到“看不见的”颜色的“礼物”的最新研究
台北故宫藏:齐白石书画作品(附高清大图及作品注释)
从初级到高级:掌握递进式结构的写作技巧
哈工程 l 增材制造形状记忆合金的最新进展
职业导向下的大学专业选择:家长与学生不可不知的考量因素
机器学习在光谱领域的五大应用
智能中医AI:全方位解答健康疑问与中医治疗方案
香港永居身份和内地户口能共存吗?如果注销了以后还能恢复内地户口吗?
FA 失效分析|Delayer去层技术详解
最新菲律宾签证办理全流程(上海领区)
痛风病和关节炎的区别
易学知识:自学梅花易数,起卦方法集锦,万物皆可算!
股票涨跌的原理是什么
详解灰度图像和二值图像
跨学科学习怎么“跨”,要让知识在情境中活起来|教育新观察
如何用Excel销售数据看板提升数据分析效率?Excel销售数据看板制作教程详解
晋惠帝司马衷:一个备受争议的西晋皇帝
《萤火突击》巴夫工厂镭钻争夺攻略:最大化收益指南
许巍最好听的10首歌,《曾经的你》《故乡》《像风一样自由》上榜
被AI颠覆一半工作的前大厂员工,花了8个月找到用AI工作的新方式
新型储能与固态电池:引爆市场的未来趋势与龙头企业机遇
如何生成测试题目的软件
雷军千万年薪招揽95后天才 AI 少女 -- DeepSeek-V2 关键开发者
对比I²C、SPI、UART通信的优缺点
解读 DeepSeek-R1 论文 - 通俗易懂版
构建电商运营核心能力:从入门到精通的关键步骤