自定义注解校验

在日常开发中经常会用到String类型的数据当作数值进行映射,势必会做出数值范围的校验,可以通过自定义注解的办法简化代码实现,减少冗余代码。 

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StrRangeValidator.class)
public @interface StrRange {/*** 错误提示* @return*/String message() default "value is not in given range";/*** 最小值* @return*/double min() default Double.MIN_VALUE;/*** 最大值* @return*/double max() default Double.MAX_VALUE;/*** 是否包含边界* @return*/boolean closeMin() default true;/*** 是否包含边界* @return*/boolean closeMax() default true;/*** 是否可空* @return*/boolean nullable() default true;Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };
}

这里的groups,payload是必须的。其他方法是根据需要设定的参数:

1. 允许null值跳过校验

2. 边界值开区间、闭区间

3. 自定义errorMessage

validatedBy 是核心的验证逻辑:

public class StrRangeValidator implements ConstraintValidator<StrRange, String> {private boolean nullable;private BigDecimal min;private BigDecimal max;private boolean closeMin;private boolean closeMax;@Overridepublic void initialize(StrRange constraintAnnotation) {nullable = constraintAnnotation.nullable();min = new BigDecimal(String.valueOf(constraintAnnotation.min()));max = new BigDecimal(String.valueOf(constraintAnnotation.max()));closeMin = constraintAnnotation.closeMin();closeMax = constraintAnnotation.closeMax();}@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if (s == null && nullable){return true;}try {BigDecimal val = new BigDecimal(s);boolean checkMin = closeMin ? min.compareTo(val) <= 0 : min.compareTo(val) < 0;boolean checkMax = closeMax ? val.compareTo(max) <= 0 : val.compareTo(max) < 0;return checkMin && checkMax;} catch (Exception ex) {return false;}}
}

String到枚举值的反向解析和验证也是比较常见的问题,也可以通过自定义注解的方式简化此类解析判断。

再来一个枚举验证:

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidEnumValidator.class)
public @interface ValidEnum {/*** 错误提示* @return*/String message() default "invalid enum value";/*** 目标类型* @return*/Class<?> target();/*** 是否可空* @return*/boolean nullable() default true;Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };
}
public class ValidEnumValidator implements ConstraintValidator<ValidEnum, String> {private Class<?> clazz;private boolean nullable;@Overridepublic void initialize(ValidEnum constraintAnnotation) {nullable = constraintAnnotation.nullable();clazz = constraintAnnotation.target();}@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if (!clazz.isEnum()) {return false;}if (s == null && nullable) {return true;}try {Method method = clazz.getDeclaredMethod("of", String.class);return method.invoke(null, s) != null;} catch (Exception e) {return false;}}
}

注意,枚举需要保持类型一致:String,都存在这样的of方法

@AllArgsConstructor
@Getter
public enum EAccountAuthTypeEnum {OPEN_ACCOUNT("1", "开户"),;private final String code;private final String msg;public static EAccountAuthTypeEnum of(String code) {return Arrays.stream(values()).filter(ele -> ele.getCode().equals(code)).findFirst().orElse(null);}
}

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

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

相关文章

【经验分享】 3D新手玩转VisionPro的工作流

第一步:文字生产图片 这样的工具有很多,stable diffusion,Midjourney等来生成图像 第二步:使用图片生3d模型工具 在线的工具有:https://huggingface.co/spaces/stabilityai/TripoSRhttps://huggingface.co/spaces/stabilityai/TripoSR 效果图 代码框架:Gi

CentOS7.9基于Apache2.4+Php7.4+Mysql8.0架构部署Zabbix6.0LTS 亲测验证完美通过方案

前言: Zabbix 由 Alexei Vladishev 创建,目前由 Zabbix SIA 主导开发和支持。 Zabbix 是一个企业级的开源分布式监控解决方案。 Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完整性的软件。 Zabbix 使用灵活的通知机制,…

蓝桥杯-排序

数组排序 Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序&#xff0c;并且时按从小到大的顺序。 package Work;import java.util.*;public class Imcomplete {public static void main(String args[]) {int arr[]new int [] {1,324,4,5,7,2};Arrays.sort(arr)…

安装系统后,如何单个盘空间扩展多个盘空间?

1、计算机-管理-存储-磁盘空间 2、压缩C盘符&#xff0c;分出多余空间 3、将多余空间扩展&#xff0c;然后修改盘符名称

SpringBoot自动装配详解

SpringBoot自动装配 在讲之前先了解一下&#xff0c;手动装配的流程。 在没有Spring Boot的情况下&#xff0c;你需要手动配置和添加相关依赖&#xff0c;以实现类似于Spring Boot自动装配的功能。主要步骤&#xff1a; 引入Spring相关依赖&#xff1a; 首先&#xff0c;你需…

基于springboot+vue实现食品安全管理系统项目【项目源码+论文说明】

基于springboot实现食品安全管理系统演示 摘要 食品行业同其他行业有很多的差别&#xff0c;食品行业不仅要管食品的生产和销售&#xff0c;还要管食品的库存和保质期&#xff0c;那么对于食品管理者来说&#xff0c;就存在着一定的难度。况且食品的种类复杂&#xff0c;存储条…

Redis分段锁,如何设计?

问题场景&#xff1a;热点库存扣减问题 秒杀场景&#xff0c;有一个难度的问题&#xff1a;热点库存扣减问题。 既要保证不发生超卖 又要保证高并发 如果解决这个高难度的问题呢&#xff1f; 答案就是使用redis 分段锁。 什么是分布式锁&#xff1f; 一个分布式系统中&am…

关于OpenAI最新的成果Sora的思考

目录 前言: 1.Sora的技术特点 1.1技术架构 1.2算法原理&#xff1a; 1.2.1自然语言处理&#xff08;NLP&#xff09;&#xff1a; 1.2.2深度学习&#xff1a; 1.2.3视频生成与编码&#xff1a; 1.3实现过程&#xff1a; 1.3.1NLP&#xff08;自然语言处理&#xff09;模…

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新&#xff0c;需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version&#xff0c;新增配置的时候为1&#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(…

vue3中watch侦听器的使用

侦听器&#xff08;watch&#xff09;是vue的核心语法之一&#xff0c;用于监听数据的变化情况。在写项目时经常会遇到&#xff0c;但经常忘记&#xff0c;重新学习了一下尚硅谷的vue3视频&#xff0c;记录一下最新的用法情况 作用&#xff1a;监视数据的变化&#xff08;和Vu…

Vue3 中的代理原理详解

Vue3 中的代理原理详解 Vue3 中引入了代理&#xff08;Proxy&#xff09;机制&#xff0c;取代了 Vue2 中的 Object.defineProperty() 机制&#xff0c;用于实现数据响应式。代理机制是 ES6 中新增的特性&#xff0c;它可以用来自定义对象中的操作&#xff0c;比如属性查找、赋…

基础算法|线性结构|前缀和学习

参考文章&#xff1a; https://blog.csdn.net/weixin_72060925/article/details/127835303 二维数组的前缀和练习&#xff1a; 这里要注意的地方就是求子矩阵和的时候&#xff0c;这里要减去的是x1-1&#xff0c;y1-1的部分&#xff0c;因为所求的目标值是包括边界的 //前缀…

【代码随想录python笔记整理】第十七课 · 判断集合成员

前言:本笔记仅仅只是对内容的整理和自行消化&#xff0c;并不是完整内容&#xff0c;如有侵权&#xff0c;联系立删。 一、集合 在之前提到&#xff0c;哈希表主要是用来判断给定的整数是否存在于给定的数据中。而在上一节中我们使用了数组&#xff0c;通过索引来实现哈希表的功…

备战蓝桥(模板篇)

扩展欧德里几算法 质数筛 分解质因数 LCA BFS floyd Dijkstra prime 日期是否合法 Tire异或 模拟散列表 字符哈希 Tire字符串统计

【C++】学习记录

一、第一个C程序 #include<iostream> using namespace std;int main() {cout << "Hello World!";return 0; } 二、数据类型、变量与常量、运算符 2.1 数据类型 2.2 变量与常量 2.3 运算符 三 、判断语句&#xff08;if-else、switch-case&#xff09; …

LeetCode(力扣)算法题_2575_找出字符串的可除整数组

找出字符串的可除整数组 题目描述 难度&#xff1a;中等 给你一个下标从 0 开始的字符串 word &#xff0c;长度为 n &#xff0c;由从 0 到 9 的数字组成。另给你一个正整数 m 。 word 的 可整除数组 div 是一个长度为 n 的整数数组&#xff0c;并满足&#xff1a; 如果…

淘宝/天猫API:电商卖家提升销售额的利器

淘宝/天猫API对于电商卖家来说确实是一个提升销售额的利器。通过使用这些API&#xff0c;卖家可以自动化和优化各种业务流程&#xff0c;从而提高销售效率、优化客户体验并增强竞争力。以下是一些建议和示例代码&#xff0c;说明如何利用淘宝/天猫API来提升销售额。 1. 获取商…

从0到1入门C++编程——10 stack容器、queue容器、list容器、set容器、map容器

文章目录 一、stack容器二、queue容器三、list容器1、构造函数2、赋值和交换3、大小及判空4、插入和删除5、数据存取6、反转和排序7、排序案例 四、set/multiset容器1、构造和赋值2、大小和交换3、插入和删除4、查找和统计5、set和multiset的区别6、pair对组的创建7、排序及规则…

边缘计算基础知识

目录 边缘计算简介任务卸载简介边缘存储系统 边缘计算简介 边缘计算是指利用靠近数据生成的网络边缘侧的设备&#xff08;如移动设备、基站、边缘服务器、边缘云等&#xff09;的计算能力和存储能力&#xff0c;使得数据和任务能够就近得到处理和执行。 一个典型的边缘计算系…

泽众云真机-为什么老机型专区大部分是维护中?如何解决

最近&#xff0c;泽众云真机平台有几位用户向我们咨询&#xff0c;为什么老机型专区大部分是维护中&#xff1f;我想使用这些机型怎么办&#xff1f; 首先来解释一下&#xff0c;为什么叫“老机型专区”&#xff1f;因为一些老的机型之前一直是在线状态&#xff0c;通过我们长期…