SpringBoot项目使用 validation进行数据校验
validation进行数据校验
@Validated
注解和 @Valid
注解都是 Spring Framework 中用于数据校验的注解,但它们有以下几点区别:
-
所在包路径不同:
@Valid
注解位于javax.validation.constraints
包下,而@Validated
注解位于org.springframework.validation.annotation
包下。 -
支持的目标类型不同:
@Valid
注解支持作用在方法参数、属性、方法返回值等多种目标类型上,而@Validated
注解仅支持作用在方法参数和类上。 -
校验能力不同:
@Valid
注解使用 Bean Validation 规范进行数据校验,支持约束注解如@NotNull
、@Email
、@Pattern
等;@Validated
注解则使用 Spring Validation 框架进行数据校验,支持约束注解如@NotBlank
、@Length
、@Min
等。虽然两者都可以用于数据校验,但这两种框架的实现方式略有不同。 -
使用场景不同:
@Valid
注解通常适用于在 Java EE 容器中使用,例如在 JPA 实体或 EJB 中进行数据校验;而@Validated
注解则主要适用于 Spring Web 应用程序中,在 Controller 或 Service 层中对请求参数进行数据校验。
需要注意的是,在使用 @Valid
注解进行数据校验时,还需要在应用程序中添加 Bean Validation API 和实现,以保证数据校验能够正常工作。而在使用 @Validated
注解进行数据校验时,Spring 框架会自动将约束注解转换为 Spring 内部的校验器,并使用其中的校验逻辑进行数据校验。
当您一个controller类中存在多个需要校验的,但是不想自己一个一个加就可以直接在controller类上加上@Validated注解
校验注解与描述
校验注解 | 描述 |
---|---|
@Null | 验证对象是否为null |
@NotNull | 验证对象是否不为null, 与@Null相反 |
@AssertTrue | 验证Boolean类型字段是否为true |
@AssertFalse | 验证Boolean类型字段是否为false |
@Min(value) | 验证数字是否大于等于指定的最小值 |
@Max(value) | 验证数字是否小于等于指定的最大值 |
@DecimalMin(value) | 验证字符串表示的数字是否大于等于指定的最小值 |
@DecimalMax(value) | 验证字符串表示的数字是否小于等于指定的最大值 |
@Size(max=, min=) | 验证字符串、集合、Map、数组的大小是否在指定范围内 |
@Digits(integer, fraction) | 验证数值是否符合指定的格式,integer指定整数精度,fraction指定小数精度 |
@Past | 验证日期是否在当前时间之前 |
@Future | 验证日期是否在当前时间之后 |
@Pattern(regex=, flag=) | 验证字符串是否符合指定的正则表达式 |
@NotEmpty | 验证字符串是否非空 |
@NotBlank | 验证字符串是否非空白字符 |
验证字符串是否为邮箱地址格式 |
maven导入
spring-boot-starter-validation 依赖项是 Spring Boot 提供的用于支持 Bean Validation API 的快速启动器。它包含了 Bean Validation API 和 Hibernate Validator 实现等必要的依赖项,并且已经在 Spring Boot 中预先配置好了相关的参数和属性。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> </dependencies>
具体使用代码:
UserRegisterDto 类,用于接收前端传入的内容:
注意:里面用到了groups,这里是为了方便在接收登录或者注册的时候用Validated(group)来指定哪几个校验注解生效
@Data public class UserVerifyDto { @Email(groups = {RegisterGroup.class, LoginGroup.class, Email.class},regexp = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", message = "邮箱格式错误") private String email; @Length(groups = {RegisterGroup.class, LoginGroup.class}, min = 2, max = 10, message = "昵称建议在2-10之间的长度") private String nickname; @Length(groups = {RegisterGroup.class, LoginGroup.class}, min =6, message = "密码最少要6位数") private String password; @Length(groups = {RegisterGroup.class}, min = 5, max = 5, message = "请输入正确的验证码") private String code; }
下面的方法里的形参有带入@Validated注解,该注解可让spring框架知道要进行校验。若使用的是Valid,则无法使用分组
@PostMapping("register") public R register(@RequestBody @Validated(RegisterGroup.class) UserVerifyDto registerDto) { CacheObject<String> verifyCodeCache = REGISTER_EMAIL_CACHE.get(registerDto.getEmail()); if (verifyCodeCache == null || verifyCodeCache.isExpire() || !registerDto.getCode().equals(verifyCodeCache.getObj())) { return R.error().msg("请获取验证码,该验证码已失效!"); } return userService.registerUser(registerDto); }
上面定义好校验注解后,我们还需要处理它返回的校验错误结果:
1.通过捕获异常处理
2.通过在方法形参里加入BindingResult
1通过捕获异常处理校验结果
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(BindException.class) public R handleValidationException(BindException ex) { R result = R.error(); for (FieldError error : ex.getBindingResult().getFieldErrors()) { result.data(error.getField(), error.getDefaultMessage()); } Optional<Object> firstError = result.getData().values().stream().findFirst(); return result.msg("请完善信息: "+firstError.orElse("表单内容") + (ex.getErrorCount()>1?" 等多项问题":"")); } }
2.通过在方法形参里加入BindingResult
@RestController @RequestMapping("/users") @Validated public class UserController { @PostMapping public String createUser(@RequestBody User user, BindingResult result) { if (result.hasErrors()) { // 处理错误信息 return "error"; } // 处理用户信息 return "success"; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!