当前位置: 首页 > news >正文

Spring Boot 注解探秘:@Validated 开启数据验证之旅(上)

在 Java Web项目开发中,数据验证是一项至关重要的环节。Spring框架中的@Validated注解为我们提供了一种方便而强大的方式来实现数据验证。本文将详细介绍 @Validated 注解的用法及其在 Spring Boot 应用中的实践。

一、基本介绍

@Validated是 Spring 框架提供的用于数据验证的注解。它可用于方法参数、方法返回值以及类上。在基于SpringBoot开发的微服务项目中,类和方法上使用的频次是最高的。

二、常用规则

@Validated注解通常与Java Bean Validation API(如 Hibernate Validator)一起使用,来定义验证规则。

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

以下是一些常用的验证规则。

1. 非空校验

  • @NotNull:用于验证对象是否为null。
  • @NotEmpty: 用于验证字符串、集合或者数组是否为null。
  • @NotBlank: 用于验证字符串是否为空且不全是空格。

这里聊聊@NotNull、@NotEmpty和@NotBlank针对字符串处理的区别。

String s = "";
String s1;
String s2 = " ";

对于类变量s,使用@NotNull注解,不会拦截住,而使用@NotEmpty和@NotBlank注解会拦截住,因为s.length() = 0;
对于类变量s1,默认就为null,使用@NotNull、@NotEmpty和@NotBlank注解
都会被拦截住。
对于类变量s2,使用@NotNull和@NotEmpty注解
都不会被拦截住,因为s.length() > 0。而@NotBlank注解会拦住,因为有空格。

2. 数值范围校验

  • @Min(value = 22) 和@Max(value=35)
    这两个注解用来校验long或者int类型的值的大小。示例中的值表示不能小于22,不能大于35。刚好是程序员的黄金13年。
  • @DecimalMin(value = “0.01”)和@DecimalMax(value = “999”)
    和上面类似,不过@DecimalMin和@DecimalMax更多用于价格,库存等场景。

3. 字符串长度校验

  • @Size:用于包装类类型的长度,数组或者集合大小的校验。
    示例如下:
@Size(min = 3, max = 10)
private String userName;@Size(min = 1, max = 3)
private List<String> phoneList;@Size(min = 1, max = 10)
private int[] numbers;

4. 正则表达式校验

  • Pattern:用于验证字符串是否符合指定的正则表达式,常用于手机号、邮箱,密码校验等场景。示例如下。
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确")
private String phone;// 常见的邮箱格式,包括用户名、@符号、域名等部分。
@Pattern(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z]{2,}$", message = "邮箱格式不正确")
private String email;// 8-16位的密码,包含字母大小写、数字、特殊符号
@Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[!@#$%^&*])[a-zA-Z\\d!@#$%^&*]{8,16}$", message = "密码格式不正确")
private String password;

5. 分组校验

假如,某零售品牌(某姆)有一个业务场景,需要手动录入并定期维护会员的信息。
会员的信息存储在vip_customer表中。表对应的实体类VipCustomer已经构建完成了,录入和更新都是基于该实体类来的。
录入会员信息的时候会员的手机号不能为空,更新的时候业务编码不能为空。那么,我们应该如何来设计验证规则呢?是的,大家都猜对了,采用分组。以下是示例代码。

// 1. 定义用户组
public interface CreateCustomerGroup{};
public interface UpdateCustomerGroup{};// 2. 绑定组名和参数
public class VipCustomer{@NotEmpty(message="业务编码不能为空", groups = UpdateCustomerGroup.class)private String bizCode;@NotEmpty(message = "会员手机号不能为空", groups = CreateCustomerGroup.class)private String phone;……
}// 3. 在controller层使用@Validated注解并指定验证组
@RestController
@ResquestMapping("sam/vip/customer")
public class CustomerController{@PutMapping("/add-customer")Response<?> addCustomer(@ResquestBody @Validated(CreateCustomerGroup.class) VipCustomer vipCustomer){}@PostMapping("/add-customer")Response<?> updateCustomer(@ResquestBody @Validated(UpdateCustomerGroup.class)  VipCustomer vipCustomer){}
}

三、总结

在SpringBoot应用中,@Validated注解通常都会与@RestControllerAdvice结合使用,以实现全局的异常处理。
当数据验证失败时,就可以捕获MethodArgumentNotValidException和ConstraintViolationException异常,并返回自定义的错误信息给客户端。

下一节我们将结合最佳实践来剖析自定义验证规则,以及全局异常处理。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据链路层与ARP协议
  • 数学建模笔记—— 灰色关联分析[GRA]
  • tekton pipeline workspaces
  • 3个办法轻松操作:flac转mp3在线快速完成
  • openVX加速-基本概念和简单代码实现
  • 迈向新一代星地融合的高速测试解决方案
  • 经验笔记:Maven 与 Gradle —— Java 构建工具对比
  • react文件详情
  • 变量与命名
  • script中的src
  • 开放API接口时要注意的安全处理总结
  • antd table 单元格编辑 触发 DatePicker(日期组件)使日期面板受控
  • 【LabVIEW学习篇 - 19】:人机界面交互设计03
  • 项目进度一
  • 鸿蒙NEXT(API 12)【蓝牙设置】 网络开发
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 5、React组件事件详解
  • Git 使用集
  • Golang-长连接-状态推送
  • HTTP 简介
  • PV统计优化设计
  • ubuntu 下nginx安装 并支持https协议
  • 从setTimeout-setInterval看JS线程
  • 高性能JavaScript阅读简记(三)
  • 工作中总结前端开发流程--vue项目
  • 简单数学运算程序(不定期更新)
  • 聚簇索引和非聚簇索引
  • 七牛云假注销小指南
  • 深度学习入门:10门免费线上课程推荐
  • 一起参Ember.js讨论、问答社区。
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 从如何停掉 Promise 链说起
  • 湖北分布式智能数据采集方法有哪些?
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​决定德拉瓦州地区版图的关键历史事件
  • #HarmonyOS:Web组件的使用
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2)Java 简介
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (九)信息融合方式简介
  • (一)Thymeleaf用法——Thymeleaf简介
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET连接数据库方式
  • .project文件
  • ??在JSP中,java和JavaScript如何交互?
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [20181219]script使用小技巧.txt
  • [AutoSar]BSW_Com02 PDU详解