JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范

news2025/6/3 10:39:19

🛠️ 一、JSR 303是什么?

JSR 303(Java Specification Requests 303)是Java EE 6的子规范,全称​​Bean Validation​​。它通过注解方式对JavaBean的属性值进行标准化校验,例如检查非空、长度、格式等规则。其参考实现是​​Hibernate Validator​​(与Hibernate ORM无关)

​核心价值​​:
✅ 将校验逻辑从业务代码剥离,提升代码可维护性
✅ 统一校验规则,避免重复编码
✅ 支持编译时和运行时校验,增强数据安全性(防止恶意绕过前端校验)


⚙️ 二、快速入门:基础使用

1️⃣ 环境搭建
  • ​Spring Boot项目​​:添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • ​非Spring项目​​:需手动引入validation-apihibernate-validator
2️⃣ 常用内置注解
注解适用类型说明示例
@NotNull任意值不能为null@NotNull(message="ID不能为空")
@NotBlankString非null且去除空格后长度>0@NotBlank(message="用户名必填")
@Size集合/String长度在指定范围内@Size(min=6, max=20, message="密码需6-20位")
@EmailString邮箱格式校验@Email(message="邮箱格式无效")
@PatternString正则表达式匹配@Pattern(regexp="^1[3-9]\\d{9}$", message="手机号格式错误")
@Min/@Max数字类型数值范围限制@Min(value=18, message="年龄需≥18")
3️⃣ 在Controller中使用

通过@Valid@Validated触发校验:

@PostMapping("/user")
public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO user) {
    // 校验通过才执行业务逻辑
    return ResponseEntity.ok("创建成功");
}
  • 校验失败会抛出MethodArgumentNotValidException,需全局异常处理

⚡ 三、进阶技巧

1️⃣ 分组校验

解决同一字段在不同场景(如新增/修改)下的差异化校验需求:

// 定义分组接口
public interface AddGroup {}
public interface UpdateGroup {}

// 实体类中使用
public class User {
    @Null(groups = AddGroup.class, message = "新增时ID必须为空")
    @NotNull(groups = UpdateGroup.class, message = "修改时ID不能为空")
    private Long id;
}

// Controller指定分组
@PostMapping("/update")
public R update(@Validated(UpdateGroup.class) @RequestBody User user) {
    // ...
}

注:未分组的注解在分组校验中不生效

2️⃣ 自定义校验

​步骤​​:

  1. ​定义注解​​:
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = ListValueConstraintValidator.class)
    public @interface ListValue {
        String message() default "值不在可选范围内";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        int[] vals() default {};  // 允许的值列表,如[0,1]
    }

  2. ​实现校验器​​:
    public class ListValueConstraintValidator 
         implements ConstraintValidator<ListValue, Integer> {
        
        private Set<Integer> set = new HashSet<>();
        
        @Override
        public void initialize(ListValue constraintAnnotation) {
            for (int val : constraintAnnotation.vals()) {
                set.add(val);
            }
        }
        
        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext context) {
            return set.contains(value);
        }
    }

  3. ​使用自定义注解​​:
    @ListValue(vals = {0, 1}, message = "状态只能是0或1")
    private Integer status;


💎 四、常见问题

  • ​Q:@Valid vs @Validated?​

    • @Valid(JSR标准):不支持分组,可嵌套校验字段。
    • @Validated(Spring扩展):支持分组,不可用于字段
  • ​Q:校验失败如何获取具体错误?​
    在Controller参数中添加BindingResult result,通过result.getFieldErrors()遍历错误详情

  • ​Q:为什么int类型推荐用Integer?​
    @Min等注解在基本类型(如int)上无法处理空值,而Integer可兼容null校验


📚 总结

JSR 303通过​​声明式注解​​简化数据校验。初学者可逐步掌握:
1️⃣ 基础注解 → 2️⃣ Controller集成 → 3️⃣ 分组/自定义校验 → 4️⃣ 全局异常处理
结合Spring生态(如Spring MVC)能极大提升开发效率和系统健壮性

更多实践参考:Hibernate Validator文档或Spring官方教程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2394795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Drawio编辑器二次开发

‌ Drawio &#xff08;现更名为 Diagrams.net &#xff09;‌是一款完全免费的在线图表绘制工具&#xff0c;由 JGraph公司 开发。它支持创建多种类型的图表&#xff0c;包括流程图、组织结构图、UML图、网络拓扑图、思维导图等&#xff0c;适用于商务演示、软件设计等多种场景…

1.测试过程之需求分析和测试计划

测试基础 流程 1.分析测试需求 2.编写测试计划 3.设计与编写测试用例 4.执行测试 5.评估与总结 测试目标 根据测试阶段不同可分为四个主要目标&#xff1a;预防错误&#xff08;早期&#xff09;、发现错误&#xff08;开发阶段&#xff09;、建立信心&#xff08;验收阶段&a…

[春秋云镜] CVE-2023-23752 writeup

首先奉上大佬的wp表示尊敬&#xff1a;&#xff08;很详细&#xff09;[ 漏洞复现篇 ] Joomla未授权访问Rest API漏洞(CVE-2023-23752)_joomla未授权访问漏洞(cve-2023-23752)-CSDN博客 知识点 Joomla版本为4.0.0 到 4.2.7 存在未授权访问漏洞 Joomla是一套全球知名的内容管理…

CSS专题之水平垂直居中

前言 石匠敲击石头的第 16 次 在日常开发中&#xff0c;经常会遇到水平垂直居中的布局&#xff0c;虽然现在基本上都用 Flex 可以轻松实现&#xff0c;但是在某些无法使用 Flex 的情况下&#xff0c;又应该如何让元素水平垂直居中呢&#xff1f;这也是一道面试的必考题&#xf…

(新)MQ高级-MQ的可靠性

消息到达MQ以后&#xff0c;如果MQ不能及时保存&#xff0c;也会导致消息丢失&#xff0c;所以MQ的可靠性也非常重要。 一、数据持久化 为了提升性能&#xff0c;默认情况下MQ的数据都是在内存存储的临时数据&#xff0c;重启后就会消失。为了保证数据的可靠性&#xff0c;必须…

Leetcode 3231. 要删除的递增子序列的最小数量

1.题目基本信息 1.1.题目描述 给定一个整数数组 nums&#xff0c;你可以执行任意次下面的操作&#xff1a; 从数组删除一个 严格递增 的 子序列。 您的任务是找到使数组为 空 所需的 最小 操作数。 1.2.题目地址 https://leetcode.cn/problems/minimum-number-of-increas…

4.2.5 Spark SQL 分区自动推断

在本节实战中&#xff0c;我们学习了Spark SQL的分区自动推断功能&#xff0c;这是一种提升查询性能的有效手段。通过创建具有不同分区的目录结构&#xff0c;并在这些目录中放置JSON文件&#xff0c;我们模拟了一个分区表的环境。使用Spark SQL读取这些数据时&#xff0c;Spar…

【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南

一、环境准备 import cv2 import numpy as np import matplotlib.pyplot as plt# 配置中文字体显示&#xff08;可选&#xff09; plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False二、图像的基本操作 1. 图像读取、显示与保存 使用OpenCV…

Spring Boot微服务架构(九):设计哲学是什么?

一、Spring Boot设计哲学是什么&#xff1f; Spring Boot 的设计哲学可以概括为 ​​“约定优于配置”​​ 和 ​​“开箱即用”​​&#xff0c;其核心目标是​​极大地简化基于 Spring 框架的生产级应用的初始搭建和开发过程​​&#xff0c;让开发者能够快速启动并运行项目…

TC/BC/OC P2P/E2E有啥区别?-PTP协议基础概念介绍

前言 时间同步网络中的每个节点&#xff0c;都被称为时钟&#xff0c;PTP协议定义了三种基本时钟节点。本文将介绍这三种类型的时钟&#xff0c;以及gPTP在同步机制上与其他机制的区别 本系列文章将由浅入深的带你了解gPTP&#xff0c;欢迎关注 时钟类型 在PTP中我们将各节…

Kafka数据怎么保障不丢失

在分布式消息系统中&#xff0c;数据不丢失是核心可靠性需求之一。Apache Kafka 通过生产者配置、副本机制、持久化策略、消费者偏移量管理等多层机制保障数据可靠性。以下从不同维度解析 Kafka 数据不丢失的核心策略&#xff0c;并附示意图辅助理解。 一、生产者端&#xff1a…

AI书签管理工具开发全记录(八):Ai创建书签功能实现

文章目录 AI书签管理工具开发全记录&#xff08;八&#xff09;&#xff1a;AI智能创建书签功能深度解析前言 &#x1f4dd;1. AI功能设计思路 &#x1f9e0;1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用 应用简介&#xff1a; X-plore 是一款强大的安卓端文件管理器&#xff0c;它可以在电视或者手机上管理大量媒体文件、应用程序。…

使用多Agent进行海报生成的技术方案及评估套件-P2P、paper2poster

最近字节、滑铁卢大学相关团队同时放出了他们使用Agent进行海报生成的技术方案&#xff0c;P2P和Paper2Poster&#xff0c;传统方案如类似ppt生成等思路&#xff0c;基本上采用固定的模版&#xff0c;提取相关的关键元素进行模版填充&#xff0c;因此&#xff0c;海报生成的质量…

Redis--缓存工具封装

经过前面的学习&#xff0c;发现缓存中的问题&#xff0c;无论是缓存穿透&#xff0c;缓存雪崩&#xff0c;还是缓存击穿&#xff0c;这些问题的解决方案业务代码逻辑都很复杂&#xff0c;我们也不应该每次都来重写这些逻辑&#xff0c;我们可以将其封装成工具。而在封装的时候…

python:在 PyMOL 中如何查看和使用内置示例文件?

参阅&#xff1a;开源版PyMol安装保姆级教程 百度网盘下载 提取码&#xff1a;csub pip show pymol 简介: PyMOL是一个Python增强的分子图形工具。它擅长蛋白质、小分子、密度、表面和轨迹的3D可视化。它还包括分子编辑、射线追踪和动画。 可视化示例‌&#xff1a;打开 PyM…

SpringCloud——Docker

1.命令解读 docker run -d 解释&#xff1a;创建并运行一个容器&#xff0c;-d则是让容器以后台进程运行 --name mysql 解释&#xff1a; 给容器起个名字叫mysql -p 3306:3306 解释&#xff1a;-p 宿主机端口:容器内端口&#xff0c;设置端口映射 注意&#xff1a; 1、…

机器学习:欠拟合、过拟合、正则化

本文目录&#xff1a; 一、欠拟合二、过拟合三、拟合问题原因及解决办法四、正则化&#xff1a;尽量减少高次幂特征的影响&#xff08;一&#xff09;L1正则化&#xff08;二&#xff09;L2正则化&#xff08;三&#xff09;L1正则化与L2正则化的对比 五、正好拟合代码&#xf…

运用集合知识做斗地主案例

方法中可变参数 一种特殊形参&#xff0c;定义在方法&#xff0c;构造器的形参列表里&#xff0c;格式&#xff1a;数据类型...参数名称&#xff1b; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给它&#xff1b;也可以…

《HelloGitHub》第 110 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对开源感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…