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

自定义注解校验

在日常开发中经常会用到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);}
}

相关文章:

自定义注解校验

在日常开发中经常会用到String类型的数据当作数值进行映射&#xff0c;势必会做出数值范围的校验&#xff0c;可以通过自定义注解的办法简化代码实现&#xff0c;减少冗余代码。 Target({ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Constraint(validatedBy St…...

由数据范围反推算法复杂度以及算法内容

一般ACM或者笔试题的时间限制是1秒或2秒。 在这种情况下&#xff0c;C代码中的操作次数控制在 1 0 7 ∼ 1 0 8 10^7\sim10^8 107∼108为最佳。 下面给出在不同数据范围下&#xff0c;代码的时间复杂度和算法该如何选择&#xff1a; n ≤ 30 n\leq30 n≤30&#xff0c;指数级别…...

js监听F11触发全屏事件

当用户使用 F11 键进行浏览器全屏时&#xff0c;由于此时并非通过浏览器提供的 Fullscreen API 进入全屏模式&#xff0c;因此无法通过 fullscreenchange 事件来监听全屏状态的变化。在这种情况下&#xff0c;可以通过监听 resize 事件来检测浏览器窗口大小的变化&#xff0c;从…...

Seata 2.x 系列【1】专栏导读

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列Seata 版本 2.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 背景2. 简介3. 适用人群4. 环境及版本5. 文章导航5…...

fly-barrage 前端弹幕库(3):滚动弹幕的设计与实现

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…...

Mysql面试总结

基础 1. 数据库的三范式是什么&#xff1f; 第一范式&#xff1a;强调的是列的原子性&#xff0c;即数据库表的每一列都是不可分割的原子数据项。第二范式&#xff1a;要求实体的属性完全依赖于主关键字。所谓完全 依赖是指不能存在仅依赖主关键字一部分的属性。第三范式&…...

【深圳五兴科技】Java后端面经

本文目录 写在前面试题总览1、java集合2、创建线程的方式3、对spring的理解4、Spring Boot 和传统 Spring 框架的一些区别5、springboot如何解决循环依赖6、对mybatis的理解7、缓存三兄弟8、接口响应慢的处理思路9、http的状态码 写在前面 关于这个专栏&#xff1a; 本专栏记录…...

画图(ccf201409-2)解题思路

解题思路 填充100*100二维数组&#xff0c;范围内的元素修改成1&#xff0c;最后累积求和。...

蓝桥杯刷题(一)

一、 import os import sys def dps(s):dp [0] * len(s)dp[0] ord(s[0]) - 96if len(s) 1:return dp[-1]dp[1] max(ord(s[0]) - 96, ord(s[1]) - 96)for i in range(2, len(s)):dp[i] max(dp[i - 1], dp[i - 2] (ord(s[i])) - 96)return dp[-1] s input() print(dps(s))…...

设计模式:策略模式 ⑥

一、策略模式思想 简介 策略模式&#xff08;Strategy Pattern&#xff09;属于对象的行为模式。其用意是针对一组算法&#xff0c;将每一个算法封装到具有共同接口的独立的类中&#xff0c;从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。…...

数据结构从入门到精通——顺序表

顺序表 前言一、线性表二、顺序表2.1概念及结构2.2 接口实现2.3 数组相关面试题2.4 顺序表的问题及思考 三、顺序表具体实现代码顺序表的初始化顺序表的销毁顺序表的打印顺序表的增容顺序表的头部/尾部插入顺序表的头部/尾部删除指定位置之前插入数据和删除指定位置数据顺序表元…...

001-CSS-水平垂直居中布局

水平垂直居中布局 方案一&#xff1a;弹性盒子布局方案二&#xff1a;绝对定位 transform方案三&#xff1a;margin 绝对定位&#xff0c;四个方向为零方案四&#xff1a;绝对定位 margin方案五&#xff1a;绝对定位 calc 方案一&#xff1a;弹性盒子布局 &#x1f4a1; T…...

【[STM32]标准库-自定义BootLoader】

[STM32]标准库-自定义BootLoader BootloaderBootloader的实现BOOTloader工程APP工程 Bootloader bootloader其实就是一段启动程序&#xff0c;它在芯片启动的时候最先被执行&#xff0c;可以用来做一些硬件的初始化或者用作固件热更新&#xff0c;当初始化完成之后跳转到对应的…...

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中&#xff0c;对于接口API发布URL访问路径&#xff0c;一般都是在类上标识RestController或者Controller注解&#xff0c;然后在方法上标识RequestMapping相关注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…...

Vue中有哪些优化性能的方法?

Vue是一款流行的JavaScript框架&#xff0c;用于构建交互性强的Web应用程序。在前端开发中&#xff0c;性能优化是一个至关重要的方面&#xff0c;尤其是当应用程序规模变大时。Vue提供了许多优化性能的方法&#xff0c;可以帮助开发人员提升应用程序的性能&#xff0c;从而提升…...

Python pandas遍历行数据的2种方法

背景 pandas在数据处理过程中&#xff0c;除了对整列字段进行处理之外&#xff0c;有时还需求对每一行进行遍历&#xff0c;来处理每行的数据。本篇文章介绍 2 种方法&#xff0c;来遍历pandas 的行数据 小编环境 import sysprint(python 版本&#xff1a;,sys.version.spli…...

Spring之@Transactional源码解析

前言 我们在日常开发的时候经常会用到组合注解,比如:EnableTransactionManagement Transactional、EnableAsync Async、EnableAspectJAutoProxy Aspect。今天我们就来抽丝剥茧,揭开Transactional注解的神秘面纱 EnableTransactionManagement注解的作用 当我们看到类似Ena…...

第三届国际亲子游泳学术峰会,麒小佑为亲游行业提供健康解决方案

第三届国际亲子游泳学术峰会大合影 2024年2月26—28日&#xff0c;第三届国际亲子游泳学术峰会在中国青岛成功召开。 第三届国际亲子游泳学术峰会是中国婴幼游泳行业最高标准的学术性会议&#xff0c;由亲游圈主办&#xff0c;旨在为本行业搭建一个高端圈层&#xff0c;帮助机…...

Python光速入门 - Flask轻量级框架

FlASK是一个轻量级的WSGI Web应用程序框架&#xff0c;Flask的核心包括Werkzeug工具箱和Jinja2模板引擎&#xff0c;它没有默认使用的数据库或窗体验证工具&#xff0c;这意味着用户可以根据自己的需求选择不同的数据库和验证工具。Flask的设计理念是保持核心简单&#xff0c…...

C/C++ 说说引用这玩仍是干啥的

引用的本质就是给某个实例对象起个外号。生活中李逵&#xff0c;也叫黑旋风。诸葛亮&#xff0c;又叫孔明。 引用的方式&#xff1a; 类型& 引用名对象名 举个例子 int i0; int& ki;//这种方式就是引用----->i有了自己的小名&#xff0c;从次叫k了 std::cout<…...

MySQL(4):事务+视图+触发器+索引+三大范式+数据库优化+数据的导入导出

文章目录一、事务二、视图三、触发器四、索引五、关系型数据库三大范式六、Mysql数据库的优化七、数据的导入和导出一、事务 1.什么是事物&#xff1f; 将一组增删改查看成一个执行单元&#xff0c;要么全成功&#xff0c;要么有一个失败&#xff0c;数据库就会回滚&#xff…...

H5扫码功能选型实战:微信JS-SDK vs 纯前端库,从公众号配置到代码封装的完整流程

H5扫码功能选型实战&#xff1a;微信JS-SDK vs 纯前端库的技术决策指南 当营销活动页需要实现"扫码领优惠券"功能时&#xff0c;技术团队突然陷入争论&#xff1a;是直接调用微信JS-SDK&#xff0c;还是采用纯前端扫码库&#xff1f;这个看似简单的技术决策&#xff…...

为什么选择Drawflow:5大优势让你爱上这个流程图库

为什么选择Drawflow&#xff1a;5大优势让你爱上这个流程图库 【免费下载链接】Drawflow Simple flow library &#x1f5a5;️&#x1f5b1;️ 项目地址: https://gitcode.com/gh_mirrors/dr/Drawflow Drawflow是一个简单而强大的JavaScript流程图库&#xff0c;专为创…...

实战踩坑:在华为ENSP模拟器上配置OSPF NSSA区域,为什么外部路由没传出去?

华为ENSP模拟器中OSPF NSSA区域外部路由失效的深度排查指南 当你在华为ENSP模拟器中配置OSPF NSSA区域时&#xff0c;是否遇到过这样的困境&#xff1a;明明按照教程步骤操作&#xff0c;外部路由却像被黑洞吞噬一般无法传递到其他区域&#xff1f;本文将带你深入这个技术迷宫的…...

PP-DocLayoutV3参数详解:text/title/table/figure等11类版面区域置信度解析

PP-DocLayoutV3参数详解&#xff1a;text/title/table/figure等11类版面区域置信度解析 1. 引言&#xff1a;为什么版面分析需要“置信度”&#xff1f; 想象一下&#xff0c;你拿到一份扫描的合同&#xff0c;想用OCR&#xff08;文字识别&#xff09;把它变成可编辑的电子版…...

嵌入式系统数据校验算法详解与实践

1. 单片机校验算法的重要性在嵌入式系统开发中&#xff0c;数据校验是确保通信可靠性和数据完整性的基础保障。我从事嵌入式开发十多年来&#xff0c;见过太多因为忽略校验而导致系统故障的案例。比如2018年参与的一个工业控制项目&#xff0c;由于CAN总线通信没有采用CRC校验&…...

暗黑3按键助手:一键解放双手的终极游戏伴侣 [特殊字符]

暗黑3按键助手&#xff1a;一键解放双手的终极游戏伴侣 &#x1f3ae; 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑3中复杂的技能连招和…...

忍者像素绘卷参数详解:CFG/Steps/画幅三要素调优指南

忍者像素绘卷参数详解&#xff1a;CFG/Steps/画幅三要素调优指南 1. 认识忍者像素绘卷 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;它将忍者的热血意志与16-Bit复古游戏美学完美融合。这款工具采用明亮的"云端"视觉设计&#xff0c;…...

终极分屏游戏解决方案:Nucleus Co-Op 让单机游戏变身多人派对

终极分屏游戏解决方案&#xff1a;Nucleus Co-Op 让单机游戏变身多人派对 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为单机游戏无法本地多…...

SEO_SEO数据监控与分析的关键指标介绍

SEO数据监控与分析的关键指标介绍 在当今数字营销的世界里&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为了每个网站运营者和数字营销人员必不可少的技能。SEO数据监控与分析是SEO工作的重要环节&#xff0c;通过对关键指标的监控和分析&#xff0c;我们可以更好…...