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

SpringBoot利用ConstraintValidator实现自定义注解校验

一、前言

        ConstraintValidator是Java Bean Validation(JSR-303)规范中的一个接口,用于实现自定义校验注解的校验逻辑。ConstraintValidator定义了两个泛型参数,分别是注解类型和被校验的值类型。在实现ConstraintValidator接口时,需要重写initialize、isValid等方法,并实现具体的校验逻辑。

二、自定义注解校验参数是否为Null

        比如校验参数name不能为null或者空字符串,先编写@interface类ValidNull:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {NullValidator.class})
public @interface ValidNull {// 默认错误消息String message() default "name不能为空";// 分组Class<?>[] groups() default {};// 负载Class<? extends Payload>[] payload() default {};
}

        再编写校验类 NullValidator:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class NullValidator implements ConstraintValidator<ValidNull, String> {@Overridepublic void initialize(ValidNull constraintAnnotation) {ConstraintValidator.super.initialize(constraintAnnotation);}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (null == value || "".equals(value)){return false;}return true;}
}

        编写实体类NullTest,并在此加上注解:

import lombok.Data;@Data
public class NullTest {@ValidNullprivate String name;
}

         最后在controller层进行调用校验,注意需要在实体类前面加上@Validated 注解,否则校验是不生效的:

    @PostMapping(value = "/test")public RetResult test(@RequestBody @Validated NullTest nullTest) {System.err.println(nullTest.getName());return RetResult.success();}

        测试结果:

        当name有值时,正常通过:

         当name为null时,提示校验错误信息:

        当name为空字符串时, 提示校验错误信息:

 

三、自定义注解校验参数值大小

        比如一个参数是数字,需要校验其大小,方法如下:

        先编写@interface类:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {NumValidator.class})
public @interface ValidNum {int value();// 默认错误消息String message() default "num不能大于20";// 分组Class<?>[] groups() default {};// 负载Class<? extends Payload>[] payload() default {};
}

        这里有添加value,这个可以在使用该注解时,传参数,下面的默认错误信息,也可以在使用注解时一起使用,只是在没有传参数时默认使用而已。

        编写NumValidator校验类:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class NumValidator implements ConstraintValidator<ValidNum,Integer> {private Integer value;@Overridepublic void initialize(ValidNum constraintAnnotation) {this.value = constraintAnnotation.value();}@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {if(value > this.value){return false;}return true;}
}

        可以看到这里也定义了value,在initialize里面初始化,也就是获取使用该注解的地方传入的值。

        编写实体类NullTest:

import lombok.Data;@Data
public class NumTest {@ValidNum(value = 30, message = "数值不能大于30")private Integer num;
}

        在controller层测试:

    @PostMapping(value = "/test")public RetResult test(@RequestBody @Validated NumTest numTest) {System.err.println(numTest.getNum());return RetResult.success();}

        测试结果:

        当传入参数小于30时:

        当传入参数大于30时:

 

相关文章:

SpringBoot利用ConstraintValidator实现自定义注解校验

一、前言 ConstraintValidator是Java Bean Validation&#xff08;JSR-303&#xff09;规范中的一个接口&#xff0c;用于实现自定义校验注解的校验逻辑。ConstraintValidator定义了两个泛型参数&#xff0c;分别是注解类型和被校验的值类型。在实现ConstraintValidator接口时&…...

十、pikachu之php反序列化

文章目录 1、php反序列化概述2、实战3、关于Magic function4、__wakeup()和destruct() 1、php反序列化概述 在理解这个漏洞前&#xff0c;首先搞清楚php中serialize()&#xff0c;unserialize()这两个函数。 &#xff08;1&#xff09;序列化serialize()&#xff1a;就是把一个…...

PHP“牵手”拼多多商品详情数据获取方法,拼多多API接口批量获取拼多多商品详情数据说明

拼多多商品详情接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取拼多多商品的详细信息&#xff0c;包括商品的标题、描述、图片等信息。在拼多多电商平台的开发中&#xff0c;拼多多详情接口 API 是非常常用的 API&#xff0c;因此本文将详细介绍拼多多…...

前端面试:【Redux】状态管理的精髓

嘿&#xff0c;亲爱的Redux探险家&#xff01;在前端开发的旅程中&#xff0c;有一个强大的状态管理工具&#xff0c;那就是Redux。Redux是一个状态容器&#xff0c;它以一种可预测的方式管理应用的状态&#xff0c;通过Store、Action、Reducer、中间件和异步处理等核心概念&am…...

element-ui中的el-table的summary-method(合计)的使用

场景图片&#xff1a; 图片1&#xff1a; 图片2&#xff1a; 一&#xff1a;使用element中的方法 优点&#xff1a; 直接使用summary-method方法&#xff0c;直接&#xff0c;方便 缺点&#xff1a; 只是在表格下面添加了一行&#xff0c;如果想有多行就不行了 1&#xff1a;h…...

“深入探索JVM:解析Java虚拟机的工作原理与性能优化“

标题&#xff1a;深入探索JVM&#xff1a;解析Java虚拟机的工作原理与性能优化 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理和性能优化。我们将首先介绍JVM的基本组成和工作流程&#xff0c;然后重点讨论JVM内存管理、垃圾回收算法以及性…...

【后端】Core框架版本和发布时间以及.net 6.0启动文件的结构

2023年&#xff0c;第35周&#xff0c;第1篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; .NET Core 是一个跨平台的开源框架&#xff0c;用于构建现代化的应用程序。它在不同版本中有一些重要的区别和发布时间 目录 一、Core版本和…...

Linux 定时任务 crontab 用法学习整理

一、linux版本 lsb_release -a 二、crontab 用法学习 2.1&#xff0c;crontab 简介 linux中crontab命令用于设置周期性被执行的指令&#xff0c;该命令从标准输入设备读取指令&#xff0c;并将其存放于“crontab”文件中&#xff0c;以供之后读取和执行。cron 系统调度进程。…...

看板之道:如何利用Kanban优化您的项目流程

引言 在项目管理的世界中&#xff0c;如何确保任务的流畅进行并及时交付是每个团队都面临的挑战。Kanban&#xff0c;作为一种敏捷项目管理方法&#xff0c;为此提供了一个答案。它不仅提供了一种可视化的方式来跟踪任务的进度&#xff0c;还鼓励团队持续改进其工作流程&#…...

Docker的基础操作

1.安装docker服务&#xff0c;配置镜像加速器 1.1 使用yum进行安装 添加docker-ce的源信息 [rootlocalhost ~]# yum install yum-utils device-mapper-persistent-data lvm2 -y [rootlocalhost ~]# yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/doc…...

14、缓存预热+缓存雪崩+缓存击穿+缓存穿透

缓存预热缓存雪崩缓存击穿缓存穿透 ● 缓存预热、雪崩、穿透、击穿分别是什么&#xff1f;你遇到过那几个情况&#xff1f; ● 缓存预热你是怎么做到的&#xff1f; ● 如何避免或者减少缓存雪崩&#xff1f; ● 穿透和击穿有什么区别&#xff1f;它两一个意思还是截然不同&am…...

【PostGreSQL】PostGreSQL到Oracle的数据迁移

项目需要&#xff0c;有个数据需要导入&#xff0c;拿到手一开始以为是mysql&#xff0c;结果是个PostGreSQL的数据&#xff0c;于是装数据库&#xff0c;但这个也不懂呀&#xff0c;而且本系统用的Oracle&#xff0c;于是得解决迁移转换的问题。 总结下来两个思路。 1、Postg…...

jupyter notebook出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

前端进阶Html+css10----定位的参照对象(高频面试题)

1.relative的参照对象 1&#xff09;元素按照标准流进行排布&#xff1b; 2&#xff09;定位参照对象是元素自己原来的位置&#xff0c;可以通过left、right、top、bottom来进行位置调整&#xff1b; 2.absolute&#xff08;子绝父相&#xff09; 1&#xff09;元素脱离标准流…...

总结记录Keras开发构建神经网络模型的三种主流方式:序列模型、函数模型、子类模型

Keras是一个易于使用且功能强大的神经网络建模库&#xff0c;它是基于Python语言开发的。Keras提供了高级API&#xff0c;使得用户能够轻松地定义和训练神经网络模型&#xff0c;无论是用于分类、回归还是其他任务。 Keras的主要特点如下&#xff1a; 简单易用&#xff1a;Kera…...

python环境建设

1. 查看通过pip安装包的路径 问题&#xff1a;devchat vscode中配置需要查找devchat的安装路径&#xff0c;使用pip相关的命令查看 pip list | grep package_name 命令显示获取已安装包的信息&#xff08;包名与版本号&#xff09;pip show package_name命令能显示该安装的包…...

Python学习笔记第五十九天(Matplotlib 安装)

Python学习笔记第五十九天 Matplotlib 安装后记 Matplotlib 安装 本章节&#xff0c;我们使用 pip 工具来安装 Matplotlib 库&#xff0c;如果还未安装该工具&#xff0c;可以参考 Python pip 安装与使用。 如果您还没有安装Matplotlib&#xff0c;您可以按照以下步骤在Pytho…...

(6)(6.3) 自动任务中的相机控制

文章目录 前言 6.3.1 概述 6.3.2 自动任务类型 6.3.3 创建合成图像 前言 本文介绍 ArduPilot 的相机和云台命令&#xff0c;并说明如何在 Mission Planner 中使用这些命令来定义相机勘测任务。这些说明假定已经连接并配置了相机触发器和云台(camera trigger and gimbal ha…...

什么是cssreset ?为什么要用到cssreset?

1&#xff0c;什么是cssreset ? 顾名思义&#xff0c;css reset&#xff0c;样式重置。即重新设置界面的样式。 CSS reset&#xff0c;又叫做 CSS 重写或者 CSS 重置&#xff0c;用于改写HTML标签的默认样式。 有些HTML标签在浏览器里有默认的样式&#xff0c;例如 p 标签有上…...

SpringCloud学习笔记(四)_ZooKeeper注册中心

基于Spring Cloud实现服务的发布与调用。而在18年7月份&#xff0c;Eureka2.0宣布停更了&#xff0c;将不再进行开发&#xff0c;所以对于公司技术选型来说&#xff0c;可能会换用其他方案做注册中心。本章学习便是使用ZooKeeper作为注册中心。 本章使用的zookeeper版本是 3.6…...

3分钟掌握ppInk:Windows屏幕标注工具的终极使用指南

3分钟掌握ppInk&#xff1a;Windows屏幕标注工具的终极使用指南 【免费下载链接】ppInk Fork from Gink 项目地址: https://gitcode.com/gh_mirrors/pp/ppInk 你是否在演示时需要用鼠标或触摸屏快速标注屏幕内容&#xff1f;是否希望有一款简单易用但功能强大的标注工具…...

基于开源项目构建智能音箱自定义电台技能:从原理到部署实践

1. 项目概述&#xff1a;一个为智能音箱打造的“龙虾电台”技能最近在折腾智能家居和语音助手&#xff0c;发现一个挺有意思的开源项目&#xff0c;叫“lobster-radio-skill”。光看名字&#xff0c;你可能会有点摸不着头脑&#xff1a;“龙虾电台”&#xff1f;这跟智能音箱有…...

为OpenClaw配置Taotoken作为其AI模型供应商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为OpenClaw配置Taotoken作为其AI模型供应商 基础教程类&#xff0c;指导使用OpenClaw这类Agent工具的开发者&#xff0c;如何将其后…...

在 Simulink 中实现并网双向 DC/AC 逆变器的无功补偿(SVG)功能仿真

目录 🛠️ 第一步:系统架构设计与模块搭建 ⚙️ 第二步:SVG 核心控制策略设计(双闭环控制) 📊 第三步:仿真运行与结果分析 手把手教你在 Simulink 中实现并网双向 DC/AC 逆变器的无功补偿(SVG)功能仿真。 在现代电力系统中,并网逆变器(如光伏、储能逆变器)不…...

国产碳化硅MOSFET在通讯电源PFC中的应用与实战解析

1. 项目概述&#xff1a;当通讯电源遇上国产碳化硅MOSFET最近在做一个通讯电源的PFC&#xff08;功率因数校正&#xff09;项目&#xff0c;客户对效率、功率密度和可靠性提出了近乎苛刻的要求。传统的硅基MOSFET方案&#xff0c;在追求更高开关频率以减小磁性元件体积时&#…...

MOOTDX:Python通达信数据接口的完整指南

MOOTDX&#xff1a;Python通达信数据接口的完整指南 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx MOOTDX是一个专为量化投资和股票数据分析设计的Python通达信数据接口封装库&#xff0c;它提供…...

终极解决方案:3分钟轻松解决腾讯游戏ACE-Guard卡顿问题

终极解决方案&#xff1a;3分钟轻松解决腾讯游戏ACE-Guard卡顿问题 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源&#xff0c;支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 还在为腾讯游戏中的ACE-Guard进程占用…...

在Nodejs后端服务中集成多模型API实现智能客服

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Nodejs后端服务中集成多模型API实现智能客服 构建一个智能客服系统时&#xff0c;开发者常常面临模型选择的两难&#xff1a;既要…...

告别Excel文件大海捞针!QueryExcel批量检索工具终极指南

告别Excel文件大海捞针&#xff01;QueryExcel批量检索工具终极指南 【免费下载链接】QueryExcel 多Excel文件内容查询工具。 项目地址: https://gitcode.com/gh_mirrors/qu/QueryExcel 你是否曾在数十个Excel文件中苦苦寻找某个关键数据&#xff1f;就像在茫茫大海中寻…...

AI 术语通俗词典:人工神经元

人工神经元是深度学习、神经网络和人工智能中非常基础的一个术语。它用来描述神经网络中最基本的数学计算单元。换句话说&#xff0c;人工神经元是在回答&#xff1a;模型怎样把多个输入信号加权合并&#xff0c;并转换成一个新的输出信号。如果说神经网络是一套由许多层组成的…...