Java参数校验详解:使用@Valid注解和自定义注解进行参数验证
很多时候我们需要使用不少if、else等等逻辑判断及验证,这样在进行一些重复的参数校验会很麻烦,且以后要维护也会吃力。
而这样就可以使用javax.validation。验证(Validation)常见的验证操作包括验证数据的类型、格式、长度、范围、唯一性等
javax.validation 包:Java SE 6+ 中引入了 javax.validation 包,作为 Bean Validation 规范的一部分。这个包提供了一组注解和接口,可以方便地进行数据验证。
<!-- validation组件依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
而对于一般写在业务逻辑类中的参数校验语句,可以省略。如将@Valid注解填写在登录接口的方法参数中:
@PostMapping("/login")
public RespBean login(@Valid @RequestBody User user) {log.info("{}", user);return userService.login(user);
}
-
@Valid 注解对入参进行相应的校验:
注解使用在方法参数上,然后对于参数的校验要求可去参数的实体类进行校验条件的填写。
/*** @author Z* @date 2023/9/27 21:25*/
@Data
public class User {@NotNull //账号非空//这个@Mobile是自定义判断注解,下面有对其的创建进行详细的讲解@Mobile(required = true) private String mobile;
@NotNull //密码非空@Length(min = 32) //长度的限制private String password;
}
以及如: @Size(min=1, max=12) 代表:长度在 1 ~ 12 字符之间。其他一些判断的注解可以去该导入的外部库查看。
也可以自定判断条件注解:如@Mobile这个自定义的注解:
1.创建软件包:Validation
2.创建需要的注解:Mobile
3.而对于这个注解的写法,直接去拷贝javax.validation 包中已经写好的注解,如:@Notnull注解进行修改:(有报错的地方就删除不用即可)
@Notnull注解如下:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotNull.List.class) //爆红了删除
@Documented
@Constraint(validatedBy = {}) //校验规则的定义
public @interface NotNull {String message() default "{javax.validation.constraints.NotNull.message}";//修改校验的消息
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
而在这里在添加一条属性:(代表必填)
boolean required() default true;
-
自定义的@Mobile如下:
/*** @author Z* @date 2023/9/28 8:53*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//自己定义校验规则的一个类:MobileValidator.class (手机号码校验规则类)
//将自定义规则类放进@Constraint(validatedBy={}) 中
@Constraint(validatedBy = {MobileValidator.class})
public @interface Mobile {
boolean required() default true;
//信息,抛出的是BindException,前端页面接收的话,我们要进行异常的捕获String message() default "手机号码格式错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
而我们需要进行自己定义检验规则,创建一个校验规则类,并将其放进@Constraint(validatedBy={}) 中
-
自定义校验规则类:
/*** 手机号码校验规则** @author Z* @date 2023/9/28 8:56*/
public class MobileValidator implements ConstraintValidator<Mobile, String> {
private boolean required = false;
//初始化:获取是否需要是必填的@Overridepublic void initialize(Mobile constraintAnnotation) {//获取到填的值:true或者falserequired = constraintAnnotation.required();}
@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {//必填:则使用手机号码校验工具类去校验if (required){return ValidatorUtil.Mobile(value);//非必填:}else {if (StringUtils.isEmpty(value)){ //传的号码为空return true;}else {//传的号码非空,则使用手机号码校验工具类去校验return ValidatorUtil.isMobile(value);}}}
}
-
而对于手机号码的校验工具类:
添加依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>
使用正则表达进行手机号码的校验:
import org.apache.commons.lang3.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*** 手机号码校验类 (使用正则表达式)** @author Z* @date 2023/9/27 21:45*/
public class ValidatorUtil {
private static final Pattern mobile_pattern = Pattern.compile("[1]([3-9])[0-9]{9}$");
public static boolean Mobile(String mobile) {if (StringUtils.isEmpty(mobile)){return false;}Matcher matcher = mobile_pattern.matcher(mobile);return matcher.matches();}
}
相关文章:
Java参数校验详解:使用@Valid注解和自定义注解进行参数验证
很多时候我们需要使用不少if、else等等逻辑判断及验证,这样在进行一些重复的参数校验会很麻烦,且以后要维护也会吃力。 而这样就可以使用javax.validation。验证(Validation)常见的验证操作包括验证数据的类型、格式、长度、范围、…...
多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测
多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现BWO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现BWO-CNN-B…...
C++ 中的引用
文章目录 C 引用的应用1. 修改函数中传递的参数2. 避免复制大型结构3. for 循环中修改所有对象4. for 循环中避免复制对象 References vs Pointers引用的限制使用引用的优点练习Quesition 1Question 2Question 3Question 4Question 5Question 6 如果一个变量被声明为引用&#…...
MQ-Det: Multi-modal Queried Object Detection in the Wild
首个支持视觉和文本查询的开放集目标检测方法 NeurIPS2023 文章:https://arxiv.org/abs/2305.18980 代码:https://github.com/YifanXu74/MQ-Det 主框图 摘要 这篇文章提出了MQ-Det,一种高效的架构和预训练策略,它利用文本描述的…...
HarmonyOS应用开发初体验
9月25日华为秋季全场景新品发布会上,余承东宣布,全面启动鸿蒙原生应用,HarmonyOS NEXT开发者预览版将在2024年第一季度面向开发者开放。 最近鸿蒙开发可谓是火得一塌糊涂,各大培训平台都开设了鸿蒙开发课程。美团发布了鸿蒙高级工…...
《C++新经典设计模式》之第4章 策略模式
《C新经典设计模式》之第4章 策略模式 策略模式.cpp 策略模式.cpp #include <iostream> #include <memory> using namespace std;// if或switch分支不稳定,经常改动时,考虑引入算法独立到策略类中去实现// 依赖倒置原则 // 高层组件不应该依…...
【方法】PowerPoint“只读方式”如何取消?
PPT设置了以“只读方式”打开,可以保护文件无法编辑更改,那后续不需要保护了,或者想要编辑文件,要如何取消“只读方式”呢? 首先,我们要看看PPT设置的是哪种“只读方式”。 如果PPT设置的是无密码“只读方…...
MySQL数据库概念与实践
MySQL数据库概念与实践 1. 概念 MySQL是一种常用的关系型数据库管理系统,具有丰富的功能和广泛的应用。在本篇博客中,我们将介绍MySQL数据库的一些重要概念和相关知识。 存储引擎 存储引擎是MySQL数据库用于存储、更新和查询数据的技术实现方法。MyS…...
【ArcGIS Pro微课1000例】0052:基于SQL Server创建企业级地理数据库案例
文章目录 环境搭建创建企业级数据库连接企业级数据库环境搭建 ArcGIS:ArcGIS Pro 3.0.1Server.ecp:版本为10.7SQL Server:版本为SQL Server Developer 2019创建企业级数据库 企业级地理数据库的创建需要通过工具箱来实现。工具位于:数据管理工具→地理数据库管理→创建企业…...
深度学习——第3章 Python程序设计语言(3.7 matplotlib库)
3.7 matplotlib库 目录 1 matplotlib库简介 2 pyplot的plot函数 3 matplotlib基础绘图函数示例 数据可视化有助于深度理解数据。 本节介绍绘制图形的基本方法。 1. matplotlib库简介 matplotlib官网 1.1 matplotlib库概述 matplotlib是Python优秀的数据可视化第三方库&a…...
【数据分析实战】酒店行业华住集团门店分布与评分多维度分析
文章目录 1. 写在前面2. 数据集展示3. 多维度分析3.1 门店档次多元化:集团投资战略观察3.1.1 代码实现3.1.2 本人浅薄理解 3.2 门店分布:各省市分布概览3.2.1 代码实现3.2.2 本人浅薄理解 3.3 门店分级评分:服务水平的多维度观察3.3.1 代码实…...
近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https,导致服务端302强制跳转到http也没反应
关于Chrome更新http强制跳转到https解决方法 近期Chrome浏览器 不知哪个版本升级后原先http强制跳转到https,导致服务端302强制跳转到http也没反应一、F12检查加载的Response Headers中有没有Non-Authoritative-Reason二、找了资料后得到解决方案:三、找…...
【scikit-learn基础】--『数据加载』之样本生成器
除了内置的数据集,scikit-learn还提供了随机样本的生成器。通过这些生成器函数,可以生成具有特定特性和分布的随机数据集,以帮助进行机器学习算法的研究、测试和比较。 目前,scikit-learn库(v1.3.0版)中有2…...
基于 ESP32-S3 的 Walter 开发板
Walter 是一款基于 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。 近日,比利时公司 DPTechnics BV 推出了一款基于乐鑫 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。该套件即将在 Crowd Supply 平台上发布,您可以点击此处了解详情。 无…...
Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes
文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…...
待做-待补充-每个节点做事,时间,以及与角度的关系
文章目录 纲领1.是否可以通过遍历一遍二叉树得到答案2.是否可以通过两颗子树相同问题的答案推导出树的答案(形式为递归)无论哪种思维模式,都需要思考:单独一个二叉树节点,它需要做什么事情?需要在什么时候做 后序判断问题是否和子树相关&…...
液态二氧化碳储存罐远程无线监测系统
二氧化碳强化石油开采技术,须先深入了解石油储层的地质特征和二氧化碳的作用机制。现场有8辆二氧化碳罐装车,每辆罐车上有4台液态二氧化碳储罐,每台罐的尾部都装有一台西门子S7-200 smart PLC。在注入二氧化碳的过程中,中控室S7-1…...
kafka学习笔记--安装部署、简单操作
本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…...
UE4 材质实现Glitch效果
材质实现Glitch效果 UE4 材质实现Glitch效果预览1预览2 UE4 材质实现Glitch效果 预览1 添加材质函数: MF_RandomNoise 添加材质: 预览2 添加材质函数MF_CustomPanner: 添加材质函数:MF_Glitch 材质添加: 下面用…...
oracle实验2023-12-8--触发器
第十四周实验 【例】功能要求:增加一新表XS_1,表结构和表XS相同,用来存放从XS表中删除的记录。 分析: 1、创建表 xs_1 SQL> create table xs_1 as select * from xs; Table created SQL> truncate table xs_1; Table truncated题目&a…...
从零搭建一个智能客服问答引擎:基于T5模型与PyTorch的完整项目实战
从零搭建智能客服问答引擎:基于T5模型与PyTorch的工业级实践 当企业客服系统每天需要处理数千条重复性问题时,人工坐席的效率瓶颈就会凸显。去年为某电商平台部署智能客服系统的经历让我深刻体会到:一个能理解"我的快递为什么三天没更新…...
Go语言的命令行工具:从flag到cobra
Go语言的命令行工具:从flag到cobra 1. 引言 命令行工具是软件开发中不可或缺的一部分,它们可以帮助我们自动化任务、管理系统、处理数据等。Go语言以其简洁的语法和强大的标准库,成为了开发命令行工具的理想选择。从基础的flag包到高级的co…...
如何在iPhone 6s上解决内核利用失败问题:TrollInstallerX完全指南
如何在iPhone 6s上解决内核利用失败问题:TrollInstallerX完全指南 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否在使用TrollInstallerX越狱iPhone 6…...
掌握Scalaz函子Functor:函数式编程的终极指南
掌握Scalaz函子Functor:函数式编程的终极指南 【免费下载链接】scalaz Principled Functional Programming in Scala 项目地址: https://gitcode.com/gh_mirrors/sc/scalaz Scalaz是一个强大的Scala函数式编程库,而Functor(函子&#…...
深入OTTO音序器:创建复杂节奏和自动化控制的完整指南
深入OTTO音序器:创建复杂节奏和自动化控制的完整指南 【免费下载链接】OTTO Sampler, Sequencer, Multi-engine synth and effects - in a box! [WIP] 项目地址: https://gitcode.com/gh_mirrors/otto1/OTTO OTTO是一款开源的数字硬件合成器、节奏盒和效果处…...
Qwen3-Reranker-0.6B镜像免配置:预置benchmark脚本一键跑通MTEB测试
Qwen3-Reranker-0.6B镜像免配置:预置benchmark脚本一键跑通MTEB测试 1. 开箱即用的重排序利器 如果你正在寻找一个开箱即用、性能出色的重排序模型,Qwen3-Reranker-0.6B绝对值得关注。这个仅有6亿参数的小巧模型,在文本重排序任务上展现出了…...
革新性植物大战僵尸辅助工具:PVZ Toolkit全方位功能解析
革新性植物大战僵尸辅助工具:PVZ Toolkit全方位功能解析 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit PVZ Toolkit是一款专为《植物大战僵尸》PC版设计的革新性辅助工具,集…...
(97页PPT)DG华为流程管理全景从定位到优化的高效增长策略(附下载方式)
篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/AI_data_cloud/89624196 资料解读:《(97页PPT)DG华为流程管理全景从定位到优化的高效增长策略》 详细资料请看本解读文章…...
Win11Debloat效能革命:Windows系统极限释放的开源优化方案
Win11Debloat效能革命:Windows系统极限释放的开源优化方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
避坑指南:海康RGBD工业相机Python开发那些事儿——从环境配置到实时显示
避坑指南:海康RGBD工业相机Python开发全流程实战 第一次接触海康RGBD相机时,我被它强大的深度感知能力吸引,但随之而来的是一连串的环境配置和开发难题。记得那个深夜,我对着报错的OpenCV界面发呆,才意识到工业级设备的…...
