首页 > 其他分享 >Spring Boot 注解探秘:@Validated 开启数据验证之旅(上)

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

时间:2024-09-07 20:52:52浏览次数:6  
标签:String 验证 Spring Boot 校验 private 注解 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异常,并返回自定义的错误信息给客户端。

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

标签:String,验证,Spring,Boot,校验,private,注解,Validated
From: https://blog.csdn.net/weixin_45593273/article/details/141903901

相关文章

  • Springboot《音悦唯尔》在线音乐播放网站129rq程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景随着互联网技术的飞速发展和智能设备的普及,在线音乐服务已成为人们日常生活中不可或缺的一部分。音乐作为情感交流与文化传承的重要载......
  • Springboot“科教兴国”支教门户网站rp778程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,支教介绍,支教新闻,招聘信息,职位申请,志愿者活动,活动报名,募捐信息,捐赠信息,支教教师,支教学生,科教职位开题报告内容一、项目背景在“科教兴国”战略......
  • 基于Node.js+vue基于Springboot的漫画网站(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,数字娱乐已成为人们日常生活中不可或缺的一部分,其中漫画作为一种独特的视觉艺术形式,深受全球读者的喜爱。然而,传统的漫画阅读方式......
  • 基于Node.js+vue基于Springboot的校园单车租赁系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着绿色出行理念的深入人心及校园规模的日益扩大,传统步行或私家车出行方式已难以满足师生们对高效、便捷、环保出行方式的需求。校园单车租赁系统应运而生,......
  • 手动添加Spring Boot的配置文件application.properties
      本文介绍在IntelliJIDEA软件中,为SpringBoot项目添加配置文件的操作方法。  最近,在IntelliJIDEA软件中新创建了一个SpringBoot项目,是通过如下图所示的方法直接新建的。  但是,随后发现这样创建的SpringBoot项目没有配置文件。如下图所示,其他的基本项目架构都是存在的......
  • 基于Node.js+vue基于springboot的汽车配件管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着汽车行业的迅猛发展,汽车配件的管理变得日益复杂和重要。传统的配件管理方式往往依赖于手工记录和纸质档案,不仅效率低下且容易出错,难以适应现代企业的快......
  • 【SpringBoot实用小知识】JSON序列化返回结果时出现的幽灵成员
    幽灵成员问题的解决前言debug过程结论及解决方式1.更改方法名称2.为方法加上@JsonIgnore注解前言这是一个很令人无语的问题在最近写代码时发现一个问题就是有时候在测试接口的时候发现返回结果中出现了一些本不该出现的字段甚至有时候还报错信息如下Writing......
  • SpringMVC基于注解使用
    01-拦截器介绍首先在pom.xml里面加入springmvc的依赖创建拦截类在spring-mvc.xml配置拦截器配置创建控制类测试拦截器中处理方法之前的方法介绍拦截器中处理方法之后,渲染之前的方法介绍拦截器中处理方法之后,渲染之后的方法介绍判断拦截器和过滤器先后的执行顺......
  • SpringMVC使用:类型转换&数据格式化&数据验证
    01-类型转换器先在pom.xml里面导入依赖,一个是mvc框架的依赖,一个是junit依赖然后在web.xml里面导入以下配置(配置的详细说明和用法我在前面文章中有写到)创建此测试类的方法用于测试springmvc是具备自动类型转换功能的user属性如下show.jsp内容如下在客户端输入如下数......
  • springboot+vue英语四六级单词学习系统【程序+论文+开题】计算机毕业设计
    系统程序文件列表开题报告内容研究背景在全球化日益加深的今天,英语作为国际通用语言的重要性不言而喻。对于广大中国学生来说,英语四六级考试不仅是衡量其英语水平的重要标尺,也是升学、就业不可或缺的敲门砖。然而,词汇作为语言学习的基础,往往是考生们备考路上的最大障碍。传......