数据校验(Validation) 常用的数据校验注解及其作用

小工具 -- Validate注解全集 我是谁? 我是搬运工,内容来自Hibernate Validator官网,翻译如有问题,自行查阅官方文档 Version: Hibernate Validator 6.0.15 Source: https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/ 一、Bean Validation constraints(Bean校验,JSR 380标准) @AssertFalse 描述:检查注解元素是否为fal 阅读详情

在 Spring Boot 项目中,数据校验(Validation) 是保证接口输入合法、提升系统健壮性的关键环节。Java 的 Bean Validation(如 jakarta.validation)提供了一系列常用的注解,结合 @Valid 或 @Validated 可以实现自动校验。


✅ 一、常用 Validation 注解一览

注解作用适用类型
@NotNull不能为 null任意对象
@NotBlank不能为 null 或 空白字符串(含空格)字符串
@NotEmpty不能为 null 或 空(集合、数组、字符串等)集合、数组、字符串
@Size限制大小(长度、元素个数)字符串、集合、数组
@Min / @Max数值最小/最大值数值类型
@DecimalMin / @DecimalMax小数最小/最大值(支持字符串)BigDecimal、Double 等
@Email邮箱格式校验字符串
@Pattern正则表达式匹配字符串
@Future / @Past时间必须是将来/过去日期类型
@Positive / @Negative正数/负数数值
@PositiveOrZero / @NegativeOrZero非负/非正数值

✅ 二、详细使用示例(含中文注释)

示例实体类:用户注册信息 UserRegisterDTO

package com.example.demo.dto;

import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.time.LocalDate;

/**
 * 用户注册信息 DTO(数据传输对象)
 * 用于接收前端注册请求参数,并进行自动校验
 */
@Getter
@Setter
public class UserRegisterDTO {

    // ==================== 字符串类校验 ====================

    /**
     * 用户名不能为空,且长度在 3-20 之间
     * @NotBlank 用于字符串,自动 trim 后判断是否为空
     */
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度必须在 {min} 到 {max} 个字符之间")
    private String username;

    /**
     * 邮箱格式必须正确,且可为空(非必填)
     * @Email 校验邮箱格式(如 user@example.com)
     */
    @Email(message = "邮箱格式不正确", regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")
    private String email;

    /**
     * 手机号必须符合中国大陆手机号格式
     * 使用正则表达式校验
     */
    @NotBlank(message = "手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String phone;

    // ==================== 数值类校验 ====================

    /**
     * 年龄必须在 18 到 120 之间
     * @Min 和 @Max 适用于整数类型
     */
    @Min(value = 18, message = "年龄不能小于 {value}")
    @Max(value = 120, message = "年龄不能大于 {value}")
    private Integer age;

    /**
     * 账户余额必须大于 0
     * @Positive 表示严格大于 0
     */
    @Positive(message = "账户余额必须为正数")
    private BigDecimal balance;

    /**
     * 折扣率范围 0.0 到 1.0(含边界)
     * @DecimalMin/@DecimalMax 支持小数比较
     */
    @DecimalMin(value = "0.0", inclusive = true, message = "折扣率不能小于 {value}")
    @DecimalMax(value = "1.0", inclusive = true, message = "折扣率不能大于 {value}")
    private Double discount;

    // ==================== 集合与数组类校验 ====================

    /**
     * 兴趣爱好列表不能为空,且至少选 1 项,最多 5 项
     * @NotEmpty 确保集合不为 null 且不为空
     * @Size 限制集合大小
     */
    @NotEmpty(message = "兴趣爱好不能为空")
    @Size(min = 1, max = 5, message = "兴趣爱好数量必须在 {min} 到 {max} 之间")
    private List<String> hobbies;

    /**
     * 用户标签数组,最多允许 3 个
     */
    @Size(max = 3, message = "标签数量不能超过 {max} 个")
    private String[] tags;

    // ==================== 时间类校验 ====================

    /**
     * 生日必须是过去的时间
     * @Past 表示日期必须在过去(不包含现在)
     */
    @Past(message = "生日必须是过去的时间")
    private LocalDate birthday;

    /**
     * 会员到期时间必须是将来的时间
     * @Future 表示日期必须在将来
     */
    @Future(message = "会员到期时间必须是将来的时间")
    private LocalDate membershipExpiryDate;

    // ==================== 对象引用校验 ====================

    /**
     * 地址信息为嵌套对象,需使用 @Valid 启用级联校验
     */
    @Valid
    private AddressDTO address;

    // ==================== Getters and Setters ====================
}

嵌套对象示例:AddressDTO

package com.example.demo.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;

/**
 * 地址信息 DTO
 * 用于级联校验(被 @Valid 引用)
 */
@Getter
@Setter
public class AddressDTO {

    @NotBlank(message = "省不能为空")
    private String province;

    @NotBlank(message = "市不能为空")
    private String city;

    @NotBlank(message = "详细地址不能为空")
    @Size(max = 200, message = "详细地址不能超过 {max} 个字符")
    private String detail;

    // Getters and Setters
}

✅ 三、Controller 使用示例

@RestController
@RequestMapping("/api/register")
public class UserController {

    @PostMapping
    public ResponseEntity<String> register(@Valid @RequestBody UserRegisterDTO dto,
                                          BindingResult result) {
        if (result.hasErrors()) {
            // 获取所有错误信息(实际项目中建议使用全局异常处理)
            String errorMsg = result.getAllErrors().stream()
                .map(e -> e.getDefaultMessage())
                .collect(Collectors.joining(", "));
            return ResponseEntity.badRequest().body("注册失败:" + errorMsg);
        }
        return ResponseEntity.ok("注册成功!");
    }
}

✅ 实际项目中建议使用 全局异常处理器 捕获 MethodArgumentNotValidException,避免每个接口都写 BindingResult


✅ 四、各注解使用场景总结

注解最佳使用场景
@NotBlank用户名、密码、昵称等非空字符串
@NotNull包装类字段(如 Long、Integer)非空判断
@NotEmpty集合、数组、字符串必须有内容
@Size限制字符串长度、集合大小、数组长度
@Min/@Max年龄、数量、页码等整数范围控制
@DecimalMin/@DecimalMax金额、折扣、税率等小数范围
@Email邮箱字段校验
@Pattern手机号、身份证、验证码等格式校验
@Future/@Past生日、有效期、预约时间等时间约束
@Positive金额、数量等必须为正
@Valid嵌套对象的级联校验

✅ 五、注意事项

  1. 仅对对象类型有效:@NotBlank、@Size 等对 String 有效,对 int 无效。
  2. 基本类型默认值问题:避免使用 int、long,建议用 Integer、Long,否则 @NotNull 无法生效。
  3. 配合 @Validated 使用分组校验:可实现“新增”和“更新”不同校验规则。
  4. 国际化支持:message = "{key}" 可从 messages.properties 加载多语言提示。
  5. 性能影响小:校验在请求解析后、进入方法前完成,开销极小。

✅ 六、测试示例(JSON 请求)

POST /api/register
Content-Type: application/json

{
  "username": "ab",
  "email": "invalid-email",
  "phone": "12345678901",
  "age": 15,
  "balance": -100,
  "discount": 1.5,
  "hobbies": [],
  "tags": ["tag1", "tag2", "tag3", "tag4"],
  "birthday": "2025-01-01",
  "membershipExpiryDate": "2024-01-01",
  "address": {
    "province": "",
    "city": "北京",
    "detail": ""
  }
}

返回错误示例:

注册失败:用户名长度必须在 3 到 20 个字符之间, 邮箱格式不正确, 手机号格式不正确, 年龄不能小于 18, 账户余额必须为正数, 折扣率不能大于 1.0, 兴趣爱好不能为空, 标签数量不能超过 3 个, 生日必须是过去的时间, 会员到期时间必须是将来的时间, 省不能为空, 详细地址不能为空

✅ 总结

这些注解是 Spring Boot 开发中 最常用、最实用的数据校验工具,合理使用可以:

  • ✅ 减少手动 if 判断
  • ✅ 提升代码可读性
  • ✅ 实现前后端协同校验
  • ✅ 支持国际化和统一异常处理

建议在项目中结合 全局异常处理 + 国际化 + @Valid 构建完整的输入校验体系。

Spring Boot 数据校验: Bean Validation 注解、分组校验与全局异常处理 注解作用示例自定义校验器在 Spring Boot 2.3.x 版本中,Bean Validation 参数校验的使用方式与之前版本略有不同,尤其是在错误处理和响应格式的自定义上。从 Spring Boot 2.3 开始,spring-boot-starter-validation 不再默认包含,需要手动添加依赖错误属性的获取方式略有变化,推荐使用 ErrorAttributeOptionsSpring Boot 2.3.x 中推荐使用。 阅读详情

相关推荐

深入理解Java Bean Validation注解@Valid的实践应用

Bean Validation允许我们通过注解来定义对象的约束条件,这些注解可以应用于类的字段、方法的参数以及方法的返回值。@Valid注解是Bean Validation中的一个重要组成部分,它用于开启级联验证(cascading validation)。当我们在一个对象引用上使用@Valid注解时,这个对象本身可以包含级联的引用,从而实现递归验证。

m0_62153576的博客 542

Java参数校验详解:使用@Valid注解和自定义注解进行参数验证

很多时候我们需要使用不少if、else等等逻辑判断及验证,这样在进行一些重复的参数校验会很麻烦,且以后要维护也会吃力。 而这样就可以使用javax.validation。验证(Validation)常见的验证操作包括验证数据的类型、格式、长度、范围、唯一性等 javax.validation 包:Java SE 6+ 中引入了 javax.validation 包,作为 Bean Validation 规范的一部分。这个包提供了一组注解和接口,可以方便地进行数据验证。 使用正则表达进行手机号码的校验:

那仰望的人,心底的孤独和叹息 9983

Java Bean Validation:约束注解的实用指南

除了使用Java Bean Validation提供的内置约束注解外,我们还可以根据自己的需求创建自定义的约束注解。例如,我们创建一个String message() default "用户名必须以字母开头,长度在3到20之间";Class <?Class <?String message() default "用户名必须以字母开头,长度在3到20之间";Class <?Class <?Constraint;

2501_90323865的博客 636

validation注解

validation注解常用注解自定义校验校验类注解类 常用注解 注解 说明 @Null 注解元素必须为null @NotNull 注解元素必须不为null @NotBlank 注解元素为字符串,并且被trim()以后length要大于0 @NotEmpty 注解元素是否为Null或者Empty @AssertTrue 验证注解元素是否为 true @AssertFalse 验证注解元素是否为 false @Size(min=, max=) 注解元素(Array,Co

weixin_44792849的博客 2091

Spring Boot中的@Valid注解数据校验:邮箱字段验证详解

数据校验是软件开发中不可或缺的一环,尤其在Web应用和服务端开发中,它确保了数据的准确性和完整性。从用户输入的表单数据,到数据库交互的数据,再到系统间的数据交换,每一个环节都可能引入错误。没有有效的数据校验机制,这些错误可能会导致系统运行异常、安全漏洞,甚至数据丢失等严重后果。数据校验有助于提前捕捉这些潜在问题,提升软件的健壮性和用户的安全体验。Spring框架提供了一系列的注解来定义Bean的属性约束,这些注解可以直接作用于Java类的字段上。通过这些注解,开发者可以轻松地为每个字段添加验证规则。

weixin_33480380的博客 1402

RV1126上YOLOv8部署实战:从模型转换到板端推理的完整避坑指南

本文提供了在瑞芯微RV1126芯片上部署YOLOv8目标识别算法的完整实战指南。内容涵盖从模型转换、环境搭建到板端推理代码编写的全流程,重点解析了RKNN-Toolkit使用、量化配置、内存优化及后处理实现等关键环节的常见问题与解决方案,旨在帮助开发者高效避坑,实现边缘AI应用的稳定落地。

pz89012345的博客 567

深入了解数据校验(Bean Validation):从深处去掌握@Valid的作用(级联校验)以及常用约束注解的解释说明【享学Java】

前言 关于Bean Validation的基本原理篇完结之后,接下来就是小伙伴最为关心的干货:使用篇。 如果说是数据校验最基本的使用,我十分相信小伙伴们都能够使用,但是有个前提:Spring MVC。我大概的调查了一下,几乎100%的人都是使用在Spring MVC的Controller层面的,而且几乎90%的人都是让它必须和@ResponseBody一起来使用去校验JavaBean入参~ 熟悉我...

架构师:通透,才能写出好代码! 8062

雷光联动自动化标校方法

动态标校需要利用动目标,在雷达和光电同时看到目标时记录光电的方位、俯仰,以及利用雷达给的目标信息计算的方位俯仰,手动记录两者的数值,多方位,多距离段记录,费时费力,且人工记录数据不全,计算容易出差错,耗费成本和精力太大。目标相距设备的水平距离 = acos(cos(设备纬度弧度值) * cos(目标纬度弧度值) * cos(设备经度弧度值 – 目标经度弧度值) + sin(设备纬度弧度值) * sin(目标纬度弧度值)) * 6378137;本发明涉及光电技术领域,安防领域,尤其涉及雷达光电动态标校等。

u013358093的博客 1578

08.Validation校验参数工具

spring的validation封装了很多校验工具,比如邮箱,时间,null的一些校验,直接通过注解实现,无需我们再花心思去写校验工具了,很方便。这里主要简单讲下基本用法。 一、引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dep.

Mr Mirror的博客 458

PX4飞控与MAVROS实战:从零搭建无人机ROS通信环境(附常见报错解决)

本文详细介绍了如何从零搭建PX4飞控与ROS的通信环境,重点解析了MAVROS的安装、硬件连接、串口权限配置以及坐标系转换等核心步骤。针对GeographicLib数据下载失败、串口权限不足等常见报错提供了实用解决方案,并附有Offboard模式控制的代码示例,帮助开发者快速建立稳定的无人机ROS开发环境。

dapp9builder的博客 335

西门子精致面板TP1200 历史数据(历史数据、审计追踪) 移存到网络路径

TP1200 审计追踪

zhang080602的博客 5768

Spring Boot 中 Validation 数据校验依赖作用详解

Spring Boot Validation 依赖的作用可以概括为:声明式校验:通过注解简化代码,使校验规则清晰直观。提高开发效率:省去大量手写校验代码的时间。提升代码可维护性:校验逻辑与业务逻辑分离,代码更整洁。保证数据安全与正确性:在数据进入业务逻辑之前就将其拦截,防止“垃圾进,垃圾出”。标准化:遵循 Java Bean Validation 标准,技术通用,易于理解。友好的错误反馈:与异常处理机制无缝集成,提供统一的错误响应格式。

BillKu的博客 586

MinerU与Docling:智能文档处理框架对比

本文对比分析了MinerU和Docling两大智能文档处理框架。MinerU专注于高精度PDF解析,采用多模态AI技术,在学术文献、金融报表等复杂文档处理上表现优异;Docling则定位企业级多格式文档处理平台,支持10+格式转换,更适合文档管理系统等场景。技术层面,MinerU基于VLM模型实现端到端处理,Docling采用插件化多后端架构。性能测试显示MinerU精度更高(95%+),但资源消耗较大;Docling处理速度更快(1-3秒/页),部署更灵活。

轩哥的个人研究和成长记录 1909

Validation框架的应用

一,前言 这篇博客只说一下Validation框架的应用,不涉及相关JSR,相关理论,以及源码的解析。 如果之后需要的话,会再开博客描写,这样会显得主题突出一些。 后续扩展部分会解释message,groups,payload三个核心属性等。 自定义注解部分,会给出蚂蚁金服内部真实采用的自定义校验注解。 二,简介 简单来说,就是通过Validation框架,进行数据的各类校验。从Java的基本数据类型到自定义封装数据类型,从非空判断到正则表达式判断,都是Validation框架所支持的。 在Validati

V539413949的博客 1335

Cadence psspxf实战:手把手教你仿真250MHz环形VCO的电源抑制比(附Verilog代码)

本文详细介绍了使用Cadence psspxf仿真器对250MHz环形VCO的电源抑制比(PSRR)进行仿真的全流程。从环形VCO的设计原理、Verilog代码实现,到Cadence环境配置、仿真参数设置,再到结果分析与优化技巧,提供了完整的实战指南。特别适合电路设计工程师学习如何评估和优化VCO的抗电源噪声能力。

weixin_42567752的博客 414

OceanSim: 基于Isaac Sim GPU 加速水下机器人感知仿真框架

OceanSim 采用先进的基于物理的渲染技术,对水下视觉和声学传感器进行精确建模。与其他模拟引擎相比,OceanSim 的渲染速度要快得多。作为 NVIDIA Issac Sim 的扩展,OceanSim 采用了多功能设计。通过融入快速发展的 NVIDIA Omniverse 生态系统,我们的模拟器自然而然地在机器人学习和水下机器人技术之间架起了一座桥梁,从而促进了水下应用中体现型人工智能技术的开发和部署。OceanSim 将以开放源码的方式提供,使研究界能够以合作的模式作出贡献。

机器人控制与仿真应用 2048

spring-boot-starter-validation校验启动器简述

可以通过自定义校验注解和校验器来实现更复杂的校验逻辑。​//默认错误消息String message() default "密码不符合复杂度要求";//分组Class

qq_28623001的博客 2470

Win11右下角不显示图标怎么办?Win11右下角不显示图标的解决方法

所以有不少符合资格的小伙伴都下载进行体验了,但是有的小伙伴在升级完系统之后发现桌面右下角不显示任何图标,那么遇到这种情况要怎么办呢?下面就和小编一起来看看有什么解决方法吧。2、接着找到任务栏设置中的“taskbar corner overflow”。3、然后在下方勾选打开想要显示的图标程序就可以了。1、首先右键任务栏,在其中选择“任务栏设置”。目前微软已经正式推出了。

2401_88800025的博客 884

关于 javax.validation.constraints的详细说明

String message() default "密码必须包含大小写字母和数字";Class<?Class<?=.*[A-Z])(?​核心价值​:通过声明式注解简化数据校验逻辑,减少样板代码。​最佳实践​:优先使用标准注解,避免重复造轮子。结合分组校验实现多场景复用。统一处理校验异常,返回清晰的错误信息。​扩展性​:通过自定义注解和校验器满足复杂业务需求。

zwh1zwh的博客 2260

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

在Spring Boot项目中,Validation(校验) 是什么?

Spring Boot中的Validation通过注解和框架集成,提供了高效、标准化的数据校验方案。合理使用内置注解、分组校验和自定义规则,可以显著提升代码的健壮性和可维护性。结合全局异常处理,还能提供友好的错误反馈,提升用户体验。是用于对应用程序中的数据(如用户输入、请求参数、实体对象等)进行合法性验证的机制,确保数据符合业务规则和约束条件。(如JSR 303、JSR 380)实现的,旨在减少手动编写校验逻辑的代码量,提高开发效率和代码可维护性。在Spring Boot项目中,

qq_40459402的博客 1148

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Springmvc的数据验证---注解式

JSR-303 Bean Validation JSR 是Java Specification Requests 的缩写,是指向 JCP(Java Community Process) 提出新增一个标准化技术规范的正式请求。 任何人都可以提交 JSR,以向 Java 平台增添新的 API 和服务,已审核通过的规范涉及 Java 各个领域,有兴趣可以了解一下。 Bean Validation 是一个...

qq_43195035的博客 250

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Validator常用注解

规则: @AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNull 任意类型 验证注解的元素值不是null @Null 任意类型 验证注解的元素值是null BigDecimal, BigInteger, byte,short, int, long,等任何Number...

过于丰富,无法简介 1480

@Valid:Java Bean Validation 完全指南

METHOD:用于 Getter 返回值校验(高级特性,很少用)。FIELD:级联成员变量(最常用:构造器/方法参数级联。TYPE_USE:Java 8+ 类型注解,支持。String message() default "身份证号码不合法";Class<?Class<?@ChineseId@Valid// 配偶信息同样会被递归“入口@Valid@Validated触发整体,字段@Valid负责级联;分组靠 Spring,嵌套别偷懒,集合加类型注解,循环引用要当心。“入口用@Valid。

一个写了10年bug的程序员日常笔记。 2249

Spring Boot接口参数校验实战与优化

参数校验是Web开发中保障系统健壮性的关键技术,基于JSR-380规范的Bean Validation通过声明式注解实现校验逻辑与业务代码解耦。Spring Boot深度整合校验体系,支持从基础类型校验到复杂业务规则验证,通过@Validated注解和分组校验实现动态验证策略。在工程实践中,合理的参数校验能有效预防XSS注入、批量操作攻击等安全风险,同时需要注意避免过度校验带来的性能损耗。本文结合电商系统等典型场景,详解如何通过自定义注解、统一异常处理等技巧构建高可用的校验体系。

weixin_34347651的博客 503

JSR303数据校验

JSR是什么 JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 关于 JSR-303 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 .

weixin_45321681的博客 279
上一篇: 符合企业级开发规范的 Spring Boot + MyBatis-Plus 标准 MVC 结构完整示例
下一篇: 数据校验(Validation)实现全局异常处理 + 国际化 + @Valid 三位一体方案
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值