实现注解校验Dto字段是否为空

news/2024/10/30 10:37:19/文章来源:https://www.cnblogs.com/lovefoolself/p/18515318

一、背景

我们用json对象作为接收参数的包装器,最后要转化为dto进行业务操作,操作之前要做非空校验,我们可以实现2个注解来实现这个通用的操作。@NotNullField @CheckNull

二、思路

1.实现@NotNullField注解,注解标记在dto字段名上面

@Target(ElementType.FIELD) // 目标为字段
@Retention(RetentionPolicy.RUNTIME) // 运行时可用
public @interface NotNullField {String fieldName() default ""; // 可自定义字段名String message() default "字段不能为空"; // 默认错误消息
}

image
2.实现@CheckNull注解,注解标记在调用方法上面,这个是要接受dto.class的
image

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckNull {//要校验的dtoClass<?> value();
}

三、代码实现

1.@NotNullField,这个我实现了一个静态方法

 /*** 校验标注了非空字段的dto* @param obj* @throws NullParamsException*/public static void validateNotNull(Object obj) throws NullParamsException {Class<?> clazz = obj.getClass();while (clazz != null) {Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(NotNullField.class)) {field.setAccessible(true); // 允许访问私有字段try {Object value = field.get(obj);if (value == null) {NotNullField annotation = field.getAnnotation(NotNullField.class);throw new NullParamsException(String.format("验证错误: %s - %s", annotation.fieldName(), annotation.message()));}else{//如果是集合类型递归调用//感觉递归调用 是一个危险的方式 大数据量会导致栈内存溢出 先进行实验//代码中如果有集合的方式必须 业务自己提取出来data自己去遍历校验if(Collections.class.isAssignableFrom(field.getType())){field.setAccessible(true); // 允许访问私有字段Collection<?> collection = (Collection<?>) value;Iterator<?> iterator = collection.iterator();while (iterator.hasNext()) {Object item = iterator.next();// 处理集合中的每个对象validateNotNull(item);}}}} catch (IllegalAccessException e) {throw new RuntimeException("访问错误", e);}}}// 移动到父类 要支持继承clazz = clazz.getSuperclass();}}

2.@CheckNull,这里的@Order 注解是标记注解起作用的顺序,因为我还写了其他校验注解

@Component
@Aspect
@Order(2)
public class CheckNullAspect {@Autowiredprivate MyAutoConfig myAutoConfig;/*** 环绕处理* 连接点* 注解的全限定名称* @return 结果* @throws Throwable 异常*/@Pointcut(value = "@annotation(具体包)")public void checkAround() throws Throwable {}@Before("checkAround()")public void around(JoinPoint proceedingJoinPoint) throws Throwable {// 从切面织入点处通过反射机制获取织入点处的方法MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();//获取切入点所在的方法Method method = signature.getMethod();//获取操作CheckNull annotation = method.getAnnotation(CheckNull.class);Class<?> dtoClass = annotation.value();// 获取入参Object[] objects = proceedingJoinPoint.getArgs();if (Objects.nonNull(objects) && objects.length > 0) {JSONObject jsonObject = (JSONObject) objects[0];Object dto = jsonObject.toJavaObject(dtoClass);CheckUtil.validateNotNull(dto);}}
}

四、后记

自定义注解实现在spring类型的项目里面超好用!

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

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

相关文章

学习高校课程-系统设计与分析-进入设计领域(lec6)

IndexFundamental Design Tasks and Activities 基本设计任务和活动 Understanding the challenges in Iteration 0 了解迭代 0 中的挑战 Structural Modeling and Behavior Modeling 结构建模和行为建模 More on Common Used DiagramsPackage Diagram 封装图 Interaction Diag…

乐维网管平台(三)如何高效管理无线网络

一、无线网络管理概述 1.什么是无线网络管理 无线网络管理是指利用专门的软件平台(如网管平台)对无线网络设备(如无线接入点、无线控制器等)及其相关资源进行集中监控、配置、优化和维护的一系列操作。其主要目的是确保无线网络的高效稳定运行,提升用户体验,保障网络安全…

销售的艺术:价值与策略

一、销售的核心在于展现价值 销售不仅仅是表面的推销技巧,如“多多关照,多多捧场”或“只有今天的500单有这个价格”。其核心在于“展现价值”,即将商品的功能、优点、魅力和价值传递给有需求的人,激发他们的购买欲望。一个简单的公式——价值>价格,是销售过程中的关键所…

Fastjson枚举序列化和反序列化的推荐实现

一、背景 项目中定义了很多dto,包含枚举类型,而且这些枚举全都自定义标志码。比如7001 对应 某种操作。返回前台时,需要转化为对应的7001,前台传入后台时也希望7001转化为枚举。 二、研究思路 一开始,研究了fastjson的默认实现。发现只有不自定义类似7001这种默认值的时候,…

第13课—数据库之索引

一、索引的介绍 1、什么是索引? (1)定义:索引是一种数据结构 一个索引在存储的表中的数据结构; (2)索引是在表的字段上创建的 (3)索引包含了一列值,这个值保存在一个数据结构中 2、索引作用? (1)保证数据记录的唯一性 (2)实现表与表之间的参照性 (3)减少排序和…

触觉智能SOM3588S鸿蒙核心板现已上市,RK3588S八核6T超高算力!

触觉智能SOM3588S鸿蒙核心板,搭载瑞芯微RK3588S芯片,采用4.5*5cm超小尺寸邮票孔+LGA封装,10层盲埋孔沉金工艺!内置八核64位CPU,Mali-G610四核GPU,6T超高算力NPU,广泛应用边缘计算、人工智能、云计算、虚拟/增强现实等行业深圳触觉智能SOM3588S鸿蒙核心板现已上市,搭载瑞…

2个月搞定计算机二级C语言——真题(6)解析

1. 前言 本篇我们讲解2个月搞定计算机二级C语言——真题 62. 程序填空题 2.1 题目要求2.2 提供的代码 #include <stdio.h> unsigned long fun(unsigned long n) {unsigned long x = 0;int t;while (n) {t = n % 10;/**********found**********/if (t % 2 == __…

5秒激活Win10

按住 Win+X ,选择 windows powershell(管理员), 输入 irm utools.run/win | iex (| 是 Enter键盘上的那个键,按住Shift+Enter上面的那个键,不行就复制粘贴)KMS激活脚本最大特色是代码开源,小巧不误报。三种激活方式分别是 :HWID数字许可证永久激活、KMS38激活至2038年、…

说透性能测试:每个测试人都能学好的性能测试!

1、提起性能测试,你的第一反应是什么? 当提到性能测试,你的第一反应是什么?是不屑一顾,认为它很简单,没发展前途、没技术含量?还是觉得它太难了,高不可攀,每当遇到系统的疑难杂症时,抓耳挠腮,无从下手? 很多IT从业人员,认为"性能测试仅仅只是测试的工作,会用…

设计卷积神经网络CNN为什么不是编程?

上一篇:《搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)》 序言:现在让我们开始走进卷积神经网络(CNN)的世界里。和传统编程完全不同,在人工智能的程序代码里,您看不到明确的算法规则,看到的只是神经网络的配置说明。这里的代码不会像传统编程那…

11 编程语言发展史

硬件编程太麻烦,想要做出软件, 早期先写伪代码用语言指令,然后用操作码表把语言转化为二进制机器代码,翻译完成后将打孔指代上的程序插入计算机; 后来每个操作码分配一个名字叫助记符,助记符后面跟着数据,形成完整指令; 但机器只能理解二进制,理解不了语言(助记符),…