芋道 Spring Boot 参数校验 Validation 入门

本文详述了在 Spring Boot 中使用 Bean Validation 和 Hibernate Validator 进行参数校验的步骤,包括注解介绍、快速入门、异常处理、自定义约束、分组校验、手动校验和国际化配置。同时,提供了代码示例和 GitHub 仓库链接,帮助开发者高效地实现参数验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击上方“芋道源码”,选择“设为星标

做积极的人,而不是积极废人!

源码精品专栏

 

摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/Validation/ 「芋道源码」欢迎转载,保留摘要,谢谢!

  • 1. 概述

  • 2. 注解

  • 3. 快速入门

  • 4. 处理校验异常

  • 5. 自定义约束

  • 6. 分组校验

  • 7. 手动校验

  • 8. 国际化 i18n

  • 666. 彩蛋


本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-22 目录。

原创不易,给点个 Star 嘿,一起冲鸭!

1. 概述

在想标题的时候,到底应该叫数据校验,还是参数校验时,我纠结了,而且非常。

最后,考虑参数校验更贴近我们的理解,就选择了它。实际更合适的叫法,还是数据校验

文头艿艿瞎哔哔了一些碎碎念,嫌弃的胖友,可以跳往 「3. 快速入门」 。

当我们想提供可靠的 API 接口,对参数的校验,以保证最终数据入库的正确性,是必不可少的活。例如说,用户注册时,会校验手机格式的正确性,密码非弱密码。

可惜的是,在翻开自己的项目的时候,会发现大量的 API 接口,我们并没有添加相应的参数校验,而是把这个活交给调用方(例如说前端)来完成。???? 甚至在艿艿接触过的后端开发中,认为这是前端的活,简直了!

世界比我们想象中的不安全,可能有“黑客”会绕过浏览器,直接使用 HTTP 工具,模拟请求向后端 API 接口传入违法的参数,以达到它们“不可告人”的目的。

又或者前端开发小哥,不小心漏做了一些 API 接口调用时的参数校验,结果导致用户提交了大量不正确的数据到后端 API 接口,并且这些数据成功入库了。这个时候,你是会甩锅给前端小哥,还是怒喷测试小姐姐验收不到位呢?

我相信,很多时候并不是我们不想添加,而是没有统一方便的方式,让我们快速的添加实现参数校验的功能。毕竟,比起枯燥的 CRUD 来说,它更枯燥。例如说,还是拿用户注册的接口,校验手机和密码这两个参数,可能就要消耗掉小 10 行的代码。更不要说,管理后台创建商品这种参数贼多的接口。

???? 世界上大多数碰到的困难,大多已经有了解决方案,特别是软件开发。实际上,Java 早在 2009 年就提出了 Bean Validation 规范,并且已经历经 JSR303、JSR349、JSR380 三次标准的置顶,发展到了 2.0

FROM https://beanvalidation.org/specification/

Bean Validation 1.0 :Bean Validation 1.0 (JSR 303) was the first version of Java's standard for object validation. It was released in 2009 and is part of Java EE 6. You can learn more about Bean Validation 1.0 here (specification text, API docs etc).

Bean Validation 1.1 :Bean Validation 1.1 (JSR 349) was finished in 2013 and is part of Java EE 7. Its main contributions are method-level validation, integration with CDI, group conversion and some more. You can learn more about Bean Validation 1.1 here (specification text, full change log, API docs etc).

Bean Validation 2.0 :Bean Validation 2.0 (JSR 380) was finished in August 2017.

It's part of Java EE 8 (but can of course be used with plain Java SE as the previous releases).

You can learn more about Bean Validation 2.0 here (specification text, full change log, API docs etc).

Bean Validation 和我们很久以前学习过的 JPA 一样,只提供规范,不提供具体的实现。

艿艿:对 JPA 不了的胖友,可以看看 《芋道 Spring Boot JPA 入门》 一文。

  • 在 Bean Validation API 中,定义了 Bean Validation 相关的接口,并没有具体实现。

  • javax.validation.constraints 包下,定义了一系列的校验注解。例如说,@NotNull@NotEmpty

实现 Bean Validation 规范的数据校验框架,主要有:

  • Hibernate Validator

    不要以为 Hibernate 仅仅是一个 ORM 框架,这只是它的 Hibernate ORM 所提供的。

    Hibernate 可是打着“Everything data”口号的,它还提供了 Hibernate Search、Hibernate OGM 等等解决方案的。????

    所以,女朋友也是 data ,我们来 new 一个就好,不需要找。

  • ???? 咳咳咳,突然想不起来还有个叫啥了,以后补充吧。啪啪打脸的疼~ Apache BVal

绝大多数情况下,也就 99.99% 吧,我们采用 Hibernate Validator 。

但是,我们在使用 Spring 的项目中,因为 Spring Validation 提供了对 Bean Validation 的内置封装支持,可以使用 @Validated 注解,实现声明式校验,而无需直接调用 Bean Validation 提供的 API 方法。而在实现原理上,也是基于 Spring AOP 拦截,实现校验相关的操作。

友情提示:这一点,类似 Spring Transaction 事务,通过 @Transactional 注解,实现声明式事务。

而在 Spring Validation 内部,最终还是调用不同的 Bean Validation 的实现框架。例如说,Hibernate Validator 。

下面,让我们开始遨游,在 Spring Boot 中,如何实现参数校验。

2. 注解

在开始入门之前,我们先了解下本文可能会涉及到的注解。

2.1 Bean Validation 定义的约束注解

javax.validation.constraints 包下,定义了一系列的约束( constraint )注解。如下:

参考 《JSR 303 - Bean Validation 介绍及最佳实践》 博客。

一共 22 个注解,快速略过即可。

  • 空和非空检查

    • @NotBlank :只能用于字符串不为 null ,并且字符串 #trim() 以后 length 要大于 0 。

    • @NotEmpty :集合对象的元素不为 0 ,即集合不为空,也可以用于字符串不为 null

    • @NotNull :不能为 null

    • @Null :必须为 null

  • 数值检查

    • @DecimalMax(value) :被注释的元素必须是一个数字,其值必须小于等于指定的最大值。

    • @DecimalMin(value) :被注释的元素必须是一个数字,其值必须大于等于指定的最小值。

    • @Digits(integer, fraction) :被注释的元素必须是一个数字,其值必须在可接受的范围内。

    • @Positive :判断正数。

    • @PositiveOrZero :判断正数或 0 。

    • @Max(value) :该字段的值只能小于或等于该值。

    • @Min(value) :该字段的值只能大于或等于该值。

    • @Negative :判断负数。

    • @NegativeOrZero :判断负数或 0 。

  • Boolean 值检查

    • @AssertFalse :被注释的元素必须为 true

    • @AssertTrue :被注释的元素必须为 false

  • 长度检查

    • @Size(max, min) :检查该字段的 size 是否在 minmax 之间,可以是字符串、数组、集合、Map 等。

  • 日期检查

    • @Future :被注释的元素必须是一个将来的日期。

    • @FutureOrPresent :判断日期是否是将来或现在日期。

    • @Past :检查该字段的日期是在过去。

    • @PastOrPresent :判断日期是否是过去或现在日期。

  • 其它检查

    • @Email :被注释的元素必须是电子邮箱地址。

    • @Pattern(value)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值