spring-boot-starter-validation

news/2025/3/20 18:09:06/文章来源:https://www.cnblogs.com/5ran2yl/p/18783618

官方提供的注解

spring-boot-starter-validation 是 Spring Boot 提供的一个 starter,是一个用于验证 Java Bean 的标准,它提供了一套注解和相应的运行时 API 来定义和执行校验规则。

具体来说,当你在项目中引入 spring-boot-starter-validation 后,你可以使用一系列预定义的约束注解(如 @NotNull, @Size, @Min, @Max 等等)来标注你的 Java Bean 的字段、方法参数或方法返回值,以定义相应的校验规则。

引入依赖:

  <!--引入Validation --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

 

接下来讲解几个常用的注解:

@NotBlank(message = "用户名不能为空")private String name;

 

NotBlank注解可以使Bean校验的Bean属性不能为空,如果为空则会抛出异常,输出注解的message中的值

@Length(min = 6,max = 32,message = "密码长度应当在6~32之间")private String password;

 

@Length注解标志Bean的属性值可使用的长度使多少,如上图的例子:最短长度为6个字符,最长的长度为多少

@Min(value = 0,message = "最小年龄为0")@Max(value = 150,message = "最大年龄为150")private Integer age;

 

@Min 和@Max都是用来校验Bean的数值属性的,最大值和最小值为多少

@Email(message = "邮箱格式错误")private String email;

 

@email注解用于判断是否符合邮箱的格式

@Pattern(regexp = "^1[3-9]\\d{9}$", message = "电话号码必须是11位且符合中国大陆手机号格式")@NotBlank(message = "电话号码不能为空")private String phoneNumber;

 

 

@Pattern注解可以实现正则表达式验证属性值

解释一下这个正则表达式的各个部分:

  • ^ 表示字符串的开始。
  • 1 表示手机号码的第一位必须是1。
  • [3-9] 表示手机号码的第二位必须在3到9之间。
  • \\d{9} 表示接下来的9位可以是任何数字(总共11位)。
  • $ 表示字符串的结束。

自定义注解

在Java中,ConstraintValidator<S,T> 是 Bean Validation API 中的一个接口,用于定义自定义的约束验证器。通过实现这个接口,你可以创建自己的校验逻辑来检查特定的数据是否符合你设定的条件。

ConstraintValidator<S, T> 参数说明
S:代表与该验证器关联的注解类型(即你自己定义的注解类)。这意味着你的验证器是为特定类型的注解服务的。
T:代表要校验的数据类型。也就是说,你希望对哪种数据类型应用这种校验逻辑。
例如,如果你有一个自定义注解 SexAnnotation 用来标记性别字段,并且你想对字符串类型的值进行校验(比如"男", "女"),那么你需要实现 ConstraintValidator<SexAnnotation, String> 接口。

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;import java.util.Arrays;
import java.util.List;public class SexValidator implements ConstraintValidator<SexAnnotation,String> {// 定义一个List类型的sexType变量private List<String> sexType;// 初始化方法,获取注解中的sexType值
    @Overridepublic void initialize(SexAnnotation constraintAnnotation) {sexType = Arrays.asList(constraintAnnotation.sexType());// 调用父类的初始化方法ConstraintValidator.super.initialize(constraintAnnotation);}// 校验方法,判断传入的值是否在sexType中
    @Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if (s!=null){//判断当前的属性值是否已经包含在注解的值中if (sexType.contains(s)){return true;}}return false;}
}

 

自定义注解:

import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;// 定义一个注解,用于验证性别
@Target({ElementType.FIELD,ElementType.PARAMETER}) // 注解可以用于字段和方法参数
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时有效
@Documented // 注解将被包含在javadoc中
@Constraint(validatedBy = {SexValidator.class}) // 注解由SexValidator类进行验证
public @interface SexAnnotation {// 性别类型,默认为空String[] sexType() default {};// 验证失败时的错误信息,默认为"性别有误,只能为boy or girl"String message() default "性别有误,只能为boy or girl";// 验证组,默认为空Class<?>[] groups() default {};// 负载,默认为空Class<? extends Payload>[] payload() default {};
}

 

注解在属性上:

    @SexAnnotation(sexType = {"boy","girl"})private String sex;

 

接下来进行属性验证的时候sex就只能使 boy 或者 girl 两个值中的任意一个,其它的值就会抛出 性别有误,只能为boy or girl的错误信息

配置全局异常拦截

这一项啊是用于优化用户体验的,如果在不配置全局异常拦截的情况下,默认注解校验错误会抛出整个异常出来,用户也看不懂,用户体验很差,故而我们可以使用全局异常拦截,将出错的信息拦截后,提取出错误提示信息在发送给前端,由valid注解抛出的异常为BindException,故需要对其进行拦截

Java代码:

import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@RestControllerAdvice
@Slf4j
public class GlobalException {// 处理所有异常@ExceptionHandler(Exception.class)public String exceptionHandler(Exception e){log.error("出现了异常"+e);return e.getMessage();}// 处理绑定异常@ExceptionHandler(BindException.class)public String bindExceptionHandler(BindException e){log.error("出现异常"+e);return e.getBindingResult().getAllErrors().get(0).getDefaultMessage();}
}

 

return e.getBindingResult().getAllErrors().get(0).getDefaultMessage(); 这里是取出注解自定义的message的文本内容返回

@RestControllerAdvice 是一个非常有用的注解,它用于定义全局异常处理器。这个注解实际上是 @ControllerAdvice 和 @ResponseBody 的组合,专门用来处理被 @RestController 方法抛出的异常,并将它们转换为适当的 HTTP 响应。

主要用途
全局异常处理:通过使用 @ExceptionHandler 注解的方法来处理特定类型的异常或所有异常,可以在一个地方集中处理应用中的异常,而不是分散在各个控制器中。
统一响应格式:可以确保对客户端返回的错误信息具有统一的格式,提升API的专业性和用户体验。

@Slf4j 是 Lombok 提供的一个注解,用于简化日志记录的代码。

@ExceptionHandler 是 Spring 框架中的一个注解,主要用于定义异常处理方法。这些方法可以捕获控制器层抛出的特定异常或一组异常,并返回自定义的响应给客户端。

全局异常拦截测试

没有使用全局异常拦截:后端控制台输出校验失败的异常,但是前端会抛出一个400的异常,对于前端开发中或者用户都是无感的,根本不知道哪里错了

使用全局异常拦截:后端也抛出了异常,但是前端也得到了很好的提示,因为@RestControllerAdvice注解包含了@ResponseBody注解,可以向前端返回文本数据

 

 

-----END-----

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

省选算法复习

省选算法复习 1. 线段树优化建图 当我们需要向区间内所有点连边或者从区间中所有点连到某个点的时候,便可以使用线段树来优化,如果需要从区间每一个点连到另一个区间每一个点的话,加一个虚点就好了。 这不是一个很困难的技巧,关键在于要建模。 P5471 [NOI2019] 弹跳 - 洛谷…

fastadmin订单父子表管理端

fastadmin后台父子表使用方法 发布于 2021-01-22 12:48:10fastadmin后台的所有表格都是支持父子表配置的,只需要简单修改一下对应的JS即可,下面直接进入主题。示例是我的全国省市行政区划表,是从国家统计局网站采集下来的,共五级行政数据,非常适合用来做父子表,按照级别一…

Rudolf and k Bridges

Rudolf and k Bridges 题目 大致题意上图为俯视图 有一个\(nXm\)的网格,下标从\(1-n\) 以及从 \(1-m\),\((i, j)\) 的值就是这个这垂直一格水的深度 现在要安装支架,有几个信息:\((i, 1)\) 和 \((i, m)\) 处必须要安装相邻支架的距离不能超过 \(d\), 相邻距离为 \(abs(j - …

背离Divergence Trading ,贪小便宜

趋势交易(trend trading)和背离交易(divergence trading),代表了两种不同的交易策略。做背离交易相当于赌市场短期失效,承认你比市场聪明,虽然能赚小钱,但往往是亏大钱的根源。 贪小便宜爱背离,贪小便宜(gain small advantages)不爱止损(cut losses),所以背离和不止损…

在鸿蒙NEXT开发中实现一个语音识别组件

鸿蒙系统发布以后都不知道叫它5.0版本还是NEXT版本了,哈哈,反正是最新版本就对了。对于语音转换文字,鸿蒙系统提供了离线语音识别模型speechRecognizer,语种目前支持中文,识别效果非常不错。今天要分享的是使用speechRecognizer实现一个语音识别组件。要实现语音识别,首先…

激光代加工产品一览-代加工-外协加工-委外加工-激光代加工-河南郑州亚克力切割雕刻代加工-芯晨微纳(河南)

关键词:河南省郑州市、激光代加工、激光打标、激光切割、激光雕刻、激光打孔、激光毛化、激光分切 简介:芯晨微纳(河南)光电科技有限公司,专注于激光微纳代加工、设备/耗材代理销售、设备租赁、技术推广服务,可处理材料类型及应用范围十分广泛,欢迎来电咨询(韩经理1823…

20242801 2024-2025-2 《网络攻防实践》第4次作业

20242801 2024-2025-2 《网络攻防实践》第4次作业 一、实验内容 ​ 在虚拟机环境中完成TCP/IP协议栈重点协议的攻击实验,学习ARP缓存欺骗攻击、ICMP重定向攻击、SYN Flood攻击、TCP RST攻击、TCP会话劫持攻击的原理和相关知识,并动手进行实践。 二、实验过程 (一)ARP缓存欺…

缓存监控治理在游戏业务的实践和探索

通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。作者:来自 vivo 互联网服务器团队- Wang Zhi 通过对 Redis 和 Caffeine 的缓存监控快速发现和定位问题降低故障的影响面。 一、缓存监控的背景游戏业务中存在大量的高频请求尤其是对热门游戏而言,而…

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析 ZYNQ系列芯片集成了ARM处理器和FPGA(可编程逻辑单元),正是因为由于ARM处理器的存在,所以我们可以在ZYNQ系列芯片上面运行Linux系统。 在ZYNQ系列芯片上运行Linux会给我们带来很多优势:首先,我们可以将部分逻辑处理…

# 20241902 2024-2025-2 《网络攻防实践》第六周作业

1.实验内容 通过本周的学习和实践,学习使用metasploitable对windows进行远程的渗透测试实验;学习利用wireshark进行日志文件的分析和攻击取证,解读攻击者所利用的攻击、攻击者的具体操作以及如何对攻击行为进行防范;实践同一内网中对利用metasploitable对其他windows系统进…

gitlab+jenkins+harbor+k8s安装操作流程之rancher

关闭防火墙 systemctl stop firewalld yum安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 下载docker-ce.repo源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo 安装docker yum install…

win11优化pyenv-venv虚拟环境切换

问题 使用 pyenv-venv activate env_name 命令激活虚拟环境后无法使用tab自动完善命令无法上下键切换历史命令脚本 #!/usr/bin/bashvenvs="/d/JavaProgramFiles/pyenv-win/pyenv-win-venv/envs" # #!/bin/bashactivate () {# 设置 PATHORIGIN_PATH="${ORIGIN_P…