注解实现校验接口传参是否超出取值范围

文章目录

  • 1、定义注解
  • 2、使用注解
  • 3、其余校验实现思路2.0
  • 4、其余校验实现思路3.0

写接口,Dto里很多字段要检验传参范围,自定义个注解来校验。

1、定义注解

注解定义代码:

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;@Target(ElementType.FIELD)
@Constraint(validatedBy = ListValue.ValidIfInRange.class)   //借助@Constraint注解实现自定义校验逻辑,validatedBy属性是数组类型,可同时定义多种校验逻辑
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ListValue {String message() default "The parameters are out of range, please check it.";  //超出取值范围后的抛错信息String[] valueList() default {};   //要检验的取值范围Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};class ValidIfInRange implements ConstraintValidator<ListValue, String> {private final Set<String> set = new HashSet<>();/*** 初始化逻辑,把取值范围存入Collection集合*/@Overridepublic void initialize(ListValue constraintAnnotation) {String[] values = constraintAnnotation.valueList();  set.addAll(Arrays.asList(values));}/*** 校验逻辑,返回false即值不存在,代表超出范围*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {return set.contains(s);}}
}

实现思路是使用JSR303校验框架的@Constraint注解,实现ConstraintValidator接口,定义初始化和参数校验逻辑。

<!--PS: JSR303校验框架依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、使用注解

@PostMapping("/test")
public void doSome3(@Validated @RequestBody Dto dto){}
public class Dto {@ListValue(valueList = {"createTime", "updateTime"}, message ="排序字段超出取值范围")String orderField;}	

调用下:

在这里插入图片描述
在这里插入图片描述

3、其余校验实现思路2.0

借用 @JsonCreator 注解,反序列化前端传参成一个枚举对象时,进行校验。

@AllArgsConstructor
@Getter
public enum OrderFieldEnum {CREATE_TIME("createTime","create_time"),USER_NAME("userName","user_name");private final String value;private final String field;private static final Map<String,OrderFieldEnum> map = new HashMap<>(3);@JsonCreatorpublic static OrderFieldEnum unSerializer(String value){//把以value为key,以枚举对象为value,存进mapif(map.isEmpty()){for (OrderFieldEnum fieldEnum : OrderFieldEnum.values()) {map.put(fieldEnum.value,fieldEnum);}}//map中找不到就是超出范围if(!map.containsKey(value)){throw new RuntimeException("超出范围");}return map.get(value);}@JsonValuepublic String getValue(){return this.value;   }}

此时Dto:

public class Dto {OrderFieldEnum orderField;}

4、其余校验实现思路3.0

这个就比较原始了,直接枚举类定义静态代码块完成取值范围初始化 + 一个静态方法完成校验:

在这里插入图片描述

这么实现的话,Service层就得调用方法校验下:

@Service
public Service implements IService{@Overridepublic doSome(Dto dto){FieldEnum.checkCodeExist(dto.getField);//....}
}

其余优秀帖子备份:https://juejin.cn/post/7009190724214194207

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

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

相关文章

meshgrid contour contourf

meshgrid contour contourf 参考video: https://www.bilibili.com/video/BV1qW411A775/?spm_id_from333.337.search-card.all.click&vd_sourced171c31a396363b8ea8c0e92a59cee6b 官方文档: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contourf.html#ma…

Cesium坐标系统

前言 补一篇Cesium坐标系知识&#xff0c;草草开稿竟把GIS中重中之重的坐标系抛之脑后&#xff0c;实在草率&#xff0c;各位道友招待不周&#xff01; 坐标系是一切花里胡哨的基础与开端&#xff0c;倘若坐标系不能明确展示、计算、分析结果将毫无意义&#xff0c;由于Cesium起…

STM32之RTC实时时钟

一、实时时钟概述 1、实时时钟介绍 英文缩写&#xff1a;RTC。显示年、月、日、时、分、秒、星期,自动计算闰年&#xff0c;能够区分每个月的天数。 RTC特点&#xff1a;能从RTC获取到具体的日期时间&#xff0c;断掉后再开机时间仍然准确&#xff08;需要纽扣电池&#xff…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU&#xff0c;编译费劲&#xff0c;而且我们的应用不需要Yocto的环境&#xff0c;所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核&#xff0c;运行频率可达1 GHz&#x…

如何通过idea使用JDK8.0创建Spring项目

目前 IDEA 进行了优化&#xff0c;所以我们在创建 Spring 项目时会发现&#xff0c;以及不能选择通过 JDK8.0 创建了&#xff0c;这是因为官方已经不再提供 JDK8.0 创建 Spring 项目&#xff0c;我们可以通过修改创建 Spring 项目的路径来解决该问题 在创建 Spring 项目的页面&…

如何快速搭建springboot+前后端分离(vue),多商户客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

kxmalls外卖生鲜多商户&#xff0c;针对中小商户、企业和个人学习者开发。使用Java编码&#xff0c;采用SpringBoot、Mybatis-Plus等易用框架&#xff0c;适合个人学习研究。同时支持单机部署、集群部署&#xff0c;用户与店铺范围动态定位&#xff0c;中小商户企业可根据业务动…

SpringCloud Aliba-Sentinel【上篇】-从入门到学废【4】

&#x1f3b5;诗词分享&#x1f3b5; 大江东去&#xff0c;浪淘尽&#xff0c;千古风流人物。 ——苏轼《念奴娇赤壁怀古》 目录 &#x1f37f;1.Sentinel是什么 &#x1f9c2;2.特点 &#x1f9c8;3.下载 &#x1f32d;4.sentinel启动 &#x1f953;5.实例演示 1.Senti…

【MySQL进阶】存储引擎

文章目录 存储引擎基本介绍引擎对比引擎选择引擎操作 存储引擎 基本介绍 对比其他数据库&#xff0c;MySQL 的架构可以在不同场景应用并发挥良好作用&#xff0c;主要体现在存储引擎&#xff0c;插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取分离&#x…

遍历二叉树

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 今天我们继续学习数据结构与算法的内容&#xff0c;主要是如何遍历一棵二叉树&#xff0c;那么我们直接开始吧。 创建二叉树 在数据结构&#xff1a;认识一棵树的最后…

合肥先进光源束测步进电机控制方案介绍

合肥先进光源束测步进电机及驱动器的选择 关于电机控制那些事 我工作中的tips总结--电机控制篇 上面提到现在业界常用的ethercat驱动器和电机&#xff0c;和以前的脉冲方式相比&#xff0c;接线就规整多了&#xff0c;驱动电流几安培的电机一根网线就可以了&#xff0c;并且这…

2024年,给程序员的六点建议

作为程序员&#xff0c;持续进步和发展是至关重要的。除了技术能力的提升&#xff0c;还有一些关键的行为和思维方式可以帮助工程师在职业生涯中取得更大的成功。本文将提供六个重要的建议&#xff0c;这些建议将帮助程序员在职业生涯中迈出成功的步伐。 走出舒适区 走出舒适区…

详解Redisson

第1章&#xff1a;Redisson简介 大家好&#xff0c;我是小黑&#xff0c;咱们今天来聊聊Redisson&#xff0c;Redisson不只是简单地对Redis进行了封装&#xff0c;它还提供了一系列高级的分布式Java数据结构&#xff0c;像是分布式锁、原子长整型这种。 首先&#xff0c;Redi…

AutoDL——终端训练神经网络模型(忽略本地问题)

前言&#xff1a; 本人之前分享过一篇文章&#xff1a;使用pycharm连接远程GPU训练神经网络模型&#xff08;超详细&#xff01;&#xff09;&#xff0c;其中详细介绍了如何利用pycharm连接AutoDL算力云平台租用的GPU服务器训练网络模型。但有些小伙伴可能会因为一些原因而导…

Linux-nginx(安装配置nginx、配置反向代理、Nginx配置负载均衡、动静分离)

关于代理 正向代理: 客户明确知道自己访问的网站是什么 隐藏客户端的信息 目录 关于代理 一、Nginx的安装与配置 1、安装依赖 2、安装nginx &#xff08;1&#xff09;上传压缩包到目录 /usr/nginx里面 &#xff08;2&#xff09;解压文件 &#xff08;3&#xff09…

c++IO类库

c对IO流的操作必须使用特定的类对象进行操作。 上图就是c中相关IO操作的类封装&#xff0c; ios_base: 是最基本的类&#xff0c;存放IO流的基本信息 ios: ios类是ios_base的子类。是相应的IO流的基类 Istream,ostream: 这两个类都是ios的子类&#xff0c;分别是输…

基于YOLOv8的学生课堂行为检测,引入BRA注意力和Shape IoU改进提升检测能力

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;介绍了学生课堂行为检测&#xff0c;并使用YOLOv8进行训练模型&#xff0c;以及引入BRA注意力和最新的Shape IoU提升检测能力 1.SCB介绍 摘要&#xff1a;利用深度学习方法自动检测学生的课堂行为是分析学生课堂表…

protobuf-Java使用.md

protobuf 环境配置 1、安装编译器 下载地址 直接解压缩。 2、配置环境变量 环境变量Path 中增加安装目录的路径 3、检查是否配置成功 protoc Usage: protoc [OPTION] PROTO_FILES Parse PROTO_FILES and generate output based on the options given:-IPATH, --proto_pa…

cmake-动态库和静态库及使用OpenCV第三方库

文章目录 静态库准备的文件CMakeLists文件使用静态库 动态库准备的文件CMakeLists文件使用动态库 使用OpenCV库 项目中会有单个源文件构建的多个可执行文件的可能。项目中有多个源文件&#xff0c;通常分布在不同子目录中。这种实践有助于项目的源代码结构&#xff0c;而且支持…

《WebKit 技术内幕》之五(2): HTML解释器和DOM 模型

2.HTML 解释器 2.1 解释过程 HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。 这一过程中&#xff0c;WebKit 内部对网页内容在各个阶段的结构表示。 WebKit 中这一过程如下&#xff1a;首先是字节流&#xff0c;经过解码之…

某马头条——day07

APP端搜索 搭建ES环境 docker pull elasticsearch:7.4.0 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.typesingle-node" elasticsear…