news 2026/4/29 2:01:24

spring-boot-starter-validation字段数据校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
spring-boot-starter-validation字段数据校验

validation

概述

spring-boot-starter-validation是 Spring Boot 官方提供的用于数据校验的启动器,它基于 Bean Validation API (JSR 380) 标准,并默认使用 Hibernate Validator 作为其实现。这个框架能让你通过声明式的注解,轻松地对控制器接收的参数、服务层的方法参数以及任何 Java Bean 进行校验,确保数据的完整性和有效性。

添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

常用注解

注解适用类型说明示例
基础校验
@NotNull任意类型校验字段值不能为null@NotNull(message = "ID不能为空")
@NotEmptyString/Collection/Array/Map校验对象不能为null且长度/大小必须大于 0@NotEmpty(message = "列表不能为空")
@NotBlankString校验字符串不能为null且去首尾空格后长度大于 0@NotBlank(message = "名称不能为空")
@Null任意类型(新增) 校验字段值必须为null@Null(message = "创建时ID必须为空")
@SizeString/Collection/Array/Map校验长度或大小是否在指定范围内@Size(min=6, max=20, message="长度需在6-20之间")
数值校验
@Min/@Max数值类型校验数值是否大于等于/小于等于指定值@Min(value=18, message="年龄需大于18")
@DecimalMin/@DecimalMax(新增) BigDecimal/String/数值类似于 Min/Max,但支持字符串值,适用于高精度数值(如金额)@DecimalMin(value="0.01", message="金额不能小于0.01")
@Digits(新增) BigDecimal/数值/String校验数值必须符合指定的整数位和小数位长度@Digits(integer=5, fraction=2, message="金额格式错误")
@Positive(新增) 数值类型校验数值必须为正数(> 0)@Positive(message = "数量必须为正数")
@PositiveOrZero(新增) 数值类型校验数值必须为正数或 0(>= 0)@PositiveOrZero(message = "数量不能为负")
@Negative(新增) 数值类型校验数值必须为负数(< 0)@Negative(message = "数值必须为负")
@NegativeOrZero(新增) 数值类型校验数值必须为负数或 0(<= 0)@NegativeOrZero(message = "数值不能为正")
逻辑校验
@AssertTrue(新增) Boolean校验字段值必须为true@AssertTrue(message = "必须同意协议")
@AssertFalse(新增) Boolean校验字段值必须为false@AssertFalse(message = "逻辑状态必须为假")
日期校验
@Future/@Past日期时间类型校验日期是否在未来/过去@Future(message = "活动日期必须是未来")
@FutureOrPresent(新增) 日期时间类型校验日期是否在未来或当前时刻@FutureOrPresent(message = "日期不能早于现在")
@PastOrPresent(新增) 日期时间类型校验日期是否在过去或当前时刻@PastOrPresent(message = "出生日期不能在未来")
格式校验
@EmailString校验是否为有效的邮箱格式@Email(message = "邮箱格式不正确")
@PatternString校验字符串是否符合指定的正则表达式@Pattern(regexp="^1[3-9]\\d{9}$", message="手机号格式错误")

自定义注解

定义注解

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy=PhoneValidator.class)// 指定校验器public@interfacePhone{Stringmessage()default"手机号格式不正确";Class<?>[]groups()default{};Class<?extendsPayload>[]payload()default{};}

实现校验逻辑

publicclassPhoneValidatorimplementsConstraintValidator<Phone,String>{privatestaticfinalStringPHONE_REGEX="^1[3-9]\\d{9}$";@OverridepublicbooleanisValid(Stringvalue,ConstraintValidatorContextcontext){returnvalue!=null&&value.matches(PHONE_REGEX);}}

使用自定义注解

publicclassUserDTO{@PhoneprivateStringphoneNumber;}

实战开发步骤

在DTO中定义校验规则

将校验注解直接添加到数据传输对象(DTO)的字段上,并可以通过message属性自定义错误信息。

publicclassUserCreateRequest{@NotBlank(message="用户名不能为空")@Size(max=50,message="用户名长度不能超过50")privateStringname;@Email(message="邮箱格式不正确")privateStringemail;@Min(value=18,message="年龄必须大于等于18")privateIntegerage;// getters and setters...}

在Controller层触发校验

在控制器方法的参数前使用@Valid@Validated注解,即可触发对该参数的校验。

@RestController@RequestMapping("/users")publicclassUserController{@PostMappingpublicResponseEntity<String>createUser(@RequestBody@ValidUserCreateRequestrequest){// 如果校验通过,代码会执行到这里returnResponseEntity.ok("用户创建成功");}}
@Valid@Validated的区别
特性@Valid(JSR-303/349 标准)@Validated(Spring 扩展)
分组校验不支持支持
方法级校验不支持支持 (需配合@Validated在类上)
嵌套对象校验支持 (需在字段上使用)支持 (需在字段上使用)

统一处理校验异常

校验失败会抛出MethodArgumentNotValidException异常。通常使用@RestControllerAdvice进行全局统一处理,向客户端返回结构化的错误信息。

@RestControllerAdvicepublicclassGlobalExceptionHandler{@ExceptionHandler(MethodArgumentNotValidException.class)publicResponseEntity<Map<String,String>>handleValidationException(MethodArgumentNotValidExceptionex){Map<String,String>errors=newHashMap<>();// 收集所有字段错误信息ex.getBindingResult().getFieldErrors().forEach(err->errors.put(err.getField(),err.getDefaultMessage()));returnResponseEntity.badRequest().body(errors);}}

分组校验

分组校验允许你在不同场景下应用不同的校验规则,例如创建(Create)和更新(Update)操作。

定义分组接口

publicclassUserGroups{publicinterfaceCreate{}publicinterfaceUpdate{}}

在DTO中指定分组

publicclassUserDTO{// 创建时ID必须为null,更新时ID不能为null@Null(groups=UserGroups.Create.class)@NotNull(groups=UserGroups.Update.class)privateLongid;@NotBlank(groups={UserGroups.Create.class,UserGroups.Update.class})privateStringusername;// getters and setters...}

在Controller中使用指定分组

@PostMapping("/create")publicStringcreate(@RequestBody@Validated(UserGroups.Create.class)UserDTOuser){...}@PutMapping("/update")publicStringupdate(@RequestBody@Validated(UserGroups.Update.class)UserDTOuser){...}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 1:58:42

5步深度优化:Win11Debloat终极系统清理与性能提升指南

5步深度优化&#xff1a;Win11Debloat终极系统清理与性能提升指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cu…

作者头像 李华
网站建设 2026/4/29 1:56:58

【限时首发|Docker官方认证架构师亲授】:2026版Toolkit如何实现「零配置多模态训练容器化」?附可运行的架构验证代码库

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker AI Toolkit 2026 发布背景与核心定位 随着大模型本地化推理、边缘AI训练和多模态工作流编排需求激增&#xff0c;容器化AI开发正从“可选实践”演进为“工程刚需”。Docker AI Toolkit 2026 应运…

作者头像 李华
网站建设 2026/4/29 1:56:04

PyTorch + TensorBoard 超实用笔记:从零开始监控你的模型训练

TensorBoard 是深度学习训练中必不可少的“仪表盘”。它可以实时展示损失曲线、准确率变化、模型结构、参数分布&#xff0c;甚至图像和音频。 好消息是&#xff1a;PyTorch 原生支持 TensorBoard&#xff0c;装一个包就能用&#xff0c;完全不用写 TensorFlow 代码。本文会带你…

作者头像 李华