SpringBoot使用自定义注解对API接口进行数据校验

SpringBoot使用自定义注解对API接口进行数据校验

前言

在Spring Boot中,使用自定义注解进行数据校验是一种非常灵活和强大的方式。本文将详细介绍如何创建自定义注解 @ValueCheck,并将其应用于控制器方法中进行数据校验。我们将增加对姓名长度、年龄范围以及姓名非法字符的校验逻辑,并创建一个全局异常处理器来处理校验失败的情况。

1. 创建自定义注解

首先,我们创建一个自定义注解 @ValueCheck,用于标记需要校验的字段。我们将增加对姓名长度、年龄范围以及姓名非法字符的支持。

package com.example.annotation;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;/*** 自定义注解 @ValueCheck,用于标记需要校验的字段。* 注解可以放在字段或方法参数上,指定校验逻辑。*/
@Documented
@Constraint(validatedBy = ValueCheckValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValueCheck {/*** 默认错误信息。* @return 错误信息*/String message() default "值不符合要求";/*** 分组,用于多组校验规则时指定当前注解属于哪一组。* @return 分组*/Class<?>[] groups() default {};/*** 额外的数据负载,通常用于传递给校验器更多上下文信息。* @return 数据负载*/Class<? extends Payload>[] payload() default {};/*** 姓名长度的最大值,默认为20。* @return 姓名长度的最大值*/int nameMaxLength() default 20;/*** 年龄的最小值,默认为0。* @return 年龄的最小值*/int ageMin() default 0;/*** 年龄的最大值,默认为150。* @return 年龄的最大值*/int ageMax() default 150;
}
2. 创建校验器

接下来,我们创建一个校验器 ValueCheckValidator,用于实现具体的校验逻辑。我们将增加对姓名长度、年龄范围以及姓名非法字符的校验。

package com.example.annotation;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;/*** 自定义校验器 ValueCheckValidator,用于实现 @ValueCheck 注解的具体校验逻辑。*/
public class ValueCheckValidator implements ConstraintValidator<ValueCheck, String> {private int nameMaxLength;private int ageMin;private int ageMax;@Overridepublic void initialize(ValueCheck constraintAnnotation) {// 初始化方法,读取注解中的属性值this.nameMaxLength = constraintAnnotation.nameMaxLength();this.ageMin = constraintAnnotation.ageMin();this.ageMax = constraintAnnotation.ageMax();}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 实现具体的校验逻辑if (value == null || value.isEmpty()) {return false;}// 检查姓名长度if (value.length() > nameMaxLength) {context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate("姓名长度超过最大允许长度 " + nameMaxLength).addConstraintViolation();return false;}// 检查姓名是否只包含中文字符if (!value.matches("[\\u4e00-\\u9fa5]+")) {context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate("姓名必须为中文字符").addConstraintViolation();return false;}// 尝试将值转换为整数,检查年龄范围try {int age = Integer.parseInt(value);if (age < ageMin || age > ageMax) {context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate("年龄必须在 " + ageMin + " 到 " + ageMax + " 之间").addConstraintViolation();return false;}} catch (NumberFormatException e) {// 如果转换失败,返回falsecontext.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate("无效的年龄格式").addConstraintViolation();return false;}// 示例校验逻辑:值必须以字母开头return Character.isLetter(value.charAt(0));}
}
3. 使用自定义注解

在控制器方法中使用自定义注解 @ValueCheck 来校验API接口的值。我们将演示如何在校验姓名长度、年龄范围以及姓名非法字符时使用注解。

package com.example.controller;import com.example.annotation.ValueCheck;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.constraints.NotNull;/*** 示例控制器,展示了如何使用 @ValueCheck 注解来校验API接口的值。*/
@RestController
@RequestMapping("/api")
@Validated
public class MyController {/*** 示例API接口,使用 @ValueCheck 注解校验请求参数。** @param name  姓名* @param age   年龄* @return 成功响应*/@PostMapping("/check-value")public ResponseEntity<String> checkValue(@RequestParam @NotNull @ValueCheck(nameMaxLength = 20) String name,@RequestParam @NotNull @ValueCheck(ageMin = 0, ageMax = 150) String age) {return ResponseEntity.ok("值符合要求");}
}
4. 全局异常处理

为了处理校验失败的情况,我们可以创建一个全局异常处理器来捕获并处理校验异常。

package com.example.exception;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;/*** 全局异常处理器,用于处理校验失败的情况。*/
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 处理 MethodArgumentNotValidException 异常。** @param ex 校验异常* @return 包含错误信息的响应*/@ResponseStatus(HttpStatus.BAD_REQUEST)@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getAllErrors().forEach((error) -> {String fieldName = ((FieldError) error).getField();String errorMessage = error.getDefaultMessage();errors.put(fieldName, errorMessage);});return ResponseEntity.badRequest().body(errors);}
}
总结

通过上述步骤,我们创建了一个自定义注解 @ValueCheck,并在控制器方法中使用它来校验API接口的值是否符合特定条件。我们增加了对姓名长度、年龄范围以及姓名非法字符的校验逻辑,并创建了一个全局异常处理器来处理校验失败的情况。这种方式不依赖于拦截器和AOP,而是利用了Spring的校验框架,使得代码更加简洁和易维护。

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

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

相关文章

如何在c++侧编译运行一个aclnn(AOL)算子?

1 AOL算子库 CANN&#xff08;Compute Architecture for Neural Networks&#xff09;提供了算子加速库&#xff08;Ascend Operator Library&#xff0c;简称AOL&#xff09;。该库提供了一系列丰富且深度优化过的高性能算子API&#xff0c;更亲和昇腾AI处理器&#xff0c;调…

IDEA git提交时如何忽略某个文件或文件夹

步骤如下 英文界面操作顺序 打开file——>settings——>Editor——>File Types 中文插件操作顺序 打开 文件——>设置——>编辑器——> 文件类型 安装下面的操作顺序添加想要屏蔽文件类型后缀即可&#xff1a;

《常用深度学习神经网络及其原理与应用场景》

一、总体介绍 一、引言 随着科技的不断发展&#xff0c;深度学习已经成为人工智能领域中最具影响力的技术之一。深度学习神经网络通过模拟人类大脑的神经元结构和工作方式&#xff0c;能够自动学习数据中的特征和模式&#xff0c;从而实现各种复杂的任务&#xff0c;如图像识…

科技革命前沿:救援机器人!

救援机器人主要制作材料 传统刚性材料&#xff1a;传统救援机器人多采用金属等刚性材料制作&#xff0c;以确保其结构强度和稳定性。这些材料在承受较大负载和复杂环境时表现出色&#xff0c;但可能缺乏一定的灵活性。 软体材料&#xff1a;近年来&#xff0c;软体机器人技术…

Ubuntu中以root身份运行Qt创建的项目

Ubuntu中以root身份运行Qt创建的项目 Chapter1 Ubuntu中以root身份运行Qt创建的项目解决方法&#xff1a; Chapter1 Ubuntu中以root身份运行Qt创建的项目 原文链接&#xff1a;https://blog.csdn.net/lhbaba/article/details/124733323 使用Qt开发项目时遇到了一个问题&#…

leetcode25:k个一组链表反转

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值…

ctfshow-web入门-反序列化(web265-web270)

目录 1、web265 2、web266 3、web267 4、web268 5、web269 6、web270 1、web265 很简单的一个判断&#xff0c;满足 $this->token$this->password; 即可 由于 $ctfshow->tokenmd5(mt_rand()) 会将 token 随机为一个 md5 值&#xff0c;我们使用 & 绕一下&am…

qt QLocale详解

1、概述 QLocale是Qt框架中的一个类&#xff0c;用于处理与本地化相关的操作。它能够方便地实现日期、时间、数字和货币的格式化和解析&#xff0c;支持不同的语言、区域设置和字符集。QLocale提供了一种跨平台的方式来获取当前系统的语言设置&#xff0c;并返回该语言的本地化…

年龄大了,听力一定会下降吗?

随着年龄的增长&#xff0c;听力下降&#xff08;也称为老年性听力损失或感音神经性聋&#xff09;确实是一个常见的现象&#xff0c;但并不是每个人都会经历明显的听力下降。以下是一些影响因素和相关信息&#xff1a; 1. 自然老化过程 •随着年龄的增长&#xff0c;内耳的毛…

Linux SSH私钥认证结合cpolar内网穿透安全高效远程登录指南

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 开发人员在工作中经常需要远程访问服务器和数据中心…

国产化浪潮下,高科技企业如何选择合适的国产ftp软件方案?

高科技企业在数字化转型和创新发展中&#xff0c;数据资产扮演着越来越重要的角色。在研发过程中产生的实验数据、设计文档、测试结果等&#xff0c;专利、商标、版权之类的创新成果等&#xff0c;随着信息量急剧增加和安全威胁的复杂化&#xff0c;传统的FTP软件已经不能满足这…

高校宿舍信息管理系统小程序

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

DNS域名详细解析详解

文章目录 DNS域名详细解析详解一、引言二、DNS域名解析过程1、DNS解析概述1.1、DNS解析的基本步骤 2、代码示例 三、DNS查询类型1、递归查询2、迭代查询 四、总结 DNS域名详细解析详解 一、引言 在互联网的世界里&#xff0c;域名和IP地址是两个不可或缺的概念。IP地址是计算…

Selenium自动化测试 —— 模拟鼠标键盘的操作事件

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 鼠标操作事件 在实际的web产品测试中&#xff0c;对于鼠标的操作&#xff0c;不单单只有clic…

全网视频下载神器一键下载全网视频!

前言 想从网上下载视频和音乐到手机吗&#xff1f;那真的很简单&#xff01;这个应用支持各种格式&#xff0c;而且完全不用花钱。当你在下载器内打开一个网站视频&#xff0c;下载器会自动“看到”它&#xff0c;你只需要点一下&#xff0c;下载就开始了。下载过程中&#xf…

系统架构师2023版:习题

架构设计基础 计算机基础 目前处理器市场中存在 CPU 和 DSP 两种类型的处理器&#xff0c;分别用于不同的场景&#xff0c;这两种处理器具有不同的体系结构&#xff0c;DSP采用()。 A.冯诺依曼结构 B.哈佛结构 C.FPGA 结构 D.与 GPU 相同的结构 解析:…

C++:lambda表达式

lambda表达式是一个可调用对象。 lambda表达式定义&#xff1a; 看作一个匿名函数。定义lambda&#xff0c;[ ]开始&#xff0c;跟&#xff08;&#xff09;&#xff0c;括号内传递参数 &#xff0c;{ }内接函数体。用一个auto 类型的变量接收。把该变量名当作该匿名函数的函数…

javascript实现sha512和sha384算法(支持微信小程序),可分多次计算

概述&#xff1a; 本人前端需要实现sha512和sha384计算的功能&#xff0c;最好是能做到分多次计算。 本文所写的代码在现有sha512和sha384的C代码&#xff0c;反复测试对比计算过程参数&#xff0c;成功改造成sha512和sha384的javascript代码&#xff0c;并成功验证好分多次计算…

C++类和对象 (下)

文章目录 前言一. 再探构造函数初始化列表特性总结练习 二. 类型转换2.1 隐式类型转换2.2 临时对象具有常性2.3 explicit关键字2.4 多参数类型转化 三. static成员概念特性练习 四. 友元概念特性 五. 内部类概念特性 六. 匿名对象概念特性 七. 对象拷贝时的编译器优化END 前言 …

【数据集】【YOLO】【目标检测】航拍船只识别数据集 3550 张,YOLO航拍水面船只识别算法实战训练教程!

一、数据集介绍 【数据集】航拍船只识别数据集 3550 张&#xff0c;目标检测&#xff0c;包含YOLO/VOC格式标注。 数据集中包含1种分类&#xff1a;{0: ship}&#xff0c;代表水面船只。 数据集来自国内外图片网站、无人机航拍视频截图以及卫星云图&#xff1b; 可用于无人…