Java中通过反射+自定义注解判断对象中部分属性是否为空,返回为空字段的名称或自定义含义

2023-11-13

场景

若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出:

若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_霸道流氓气质的博客-CSDN博客

在上面进行excel导入时,需要对数据进行非空校验。

比如对象中有多个属性,需要判断其中几个属性是否为空,为空则返回给前端提示。新建实体类,有如下字段

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class LimitQuotaStatistics extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** id */
    private Long id;

    /** 部门id */
    private Long deptId;

    /** 部门名称 */
    @Excel(name = "部门名称")
    private String deptName;

    /** 夜班人数 */
    @Excel(name = "夜班人数")
    private Long nightShiftNum;

    /** 早班人数 */
    @Excel(name = "早班人数")
    private Long morningShiftNum;

    /** 早中班人数 */
    @Excel(name = "早中班人数")
    private Long morningMiddlleShiftNum;

    /** 晚中班人数 */
    @Excel(name = "晚中班人数")
    private Long nightMiddleShiftNum;

    /** 合计人数 */
    @Excel(name = "合计人数")
    private Long totalNum;

    /** 定额人数 */
    @Excel(name = "定额人数")
    private Long quotaNum;

    /** 计划日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planDate;

}

这里的@Excel注解为若依自带的自定义注解,下面会用到其name属性。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、构造一个实体对象,并且只给morningShiftNum赋值

        LimitQuotaStatistics limitQuotaStatistics = LimitQuotaStatistics.builder()
                .morningShiftNum(3l)
                .build();

2、假设我们需要对其中的某些字段进行非空校验

把需要进行非空校验的字段抽离到Constants

public class LimitConstants
{
    public static final List<String> LIMIT_QUOTA_IMPORT_NOTNULL_CHECK = new ArrayList<String>(){{
        this.add("nightShiftNum");
        this.add("morningShiftNum");
        this.add("morningMiddlleShiftNum");
        this.add("totalNum");
        this.add("quotaNum");
    }};
}

假如需要对上面这几个字段进行非空校验,如果这几个字段中有为null,则返回对应的字段名

那么上面构造的实体对象,应该返回nightShiftNum、morningMiddlleShiftNum、totalNum、quotaNum这四个字段。

3、封装一个工具类方法,通过反射获取该对象的所有字段,然后筛选字段是否在上面要检查的list中并且值为null的即可

    /**
     * 检查对象的属性是否为空
     * @param obj 检查对象
     * @param checkField 要检查的属性名list
     * @return 为空的属性名list
     * @throws IllegalAccessException
     */
    public static List<String> checkObjFieldIsNull(Object obj, List<String> checkField) throws IllegalAccessException {

        List<String> res = new ArrayList<>();
        //获取对象的类
        Class<?> aClass = obj.getClass();
        //获取对象的所有字段,包含public、private和proteced
        Field[] declaredFields = aClass.getDeclaredFields();
        //筛选出包含在要检查的list 并且 属性为null的字段
        Arrays.stream(declaredFields).forEach(field -> {
            //设置属性可访问
            field.setAccessible(true);
            try {
                if(checkField.contains(field.getName()) && field.get(obj) == null){
                    //获取字段名
                    res.add(field.getName());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
        return res;
    }

然后调用进行测试

    @Test
    public void checkFieldIsNull(){
        LimitQuotaStatistics limitQuotaStatistics = LimitQuotaStatistics.builder()
                .morningShiftNum(3l)
                .build();
        List<String> checkFields = LimitConstants.LIMIT_QUOTA_IMPORT_NOTNULL_CHECK;
        try {
            checkObjFieldIsNull(limitQuotaStatistics,checkFields).stream().forEach(System.out::println);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

测试结果

 

但是把这些对象的字段名直接返回给前端提示不大友好,是否可以直接返回对应的自定义的含义名称。

4、回到上面自定义注解@Excel中,是否可以获取每个字段上的name的值

首先自定义注解,比如这里的@Excel,就可以将注解作用在类上

/**
 * 自定义导出Excel数据注解
 *
 * @author ruoyi
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
    /**
     * 导出时在excel中排序
     */
    public int sort() default Integer.MAX_VALUE;

    /**
     * 导出到Excel中的名字.
     */
    public String name() default "";

}

这里只做演示用,所以只保留了一个name属性

@Retention(RetentionPolicy.RUNTIME)表示注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。

@Target(ElementType.FIELD)表示此注解的作用目标是字段和枚举的常量上

2、创建实体类,并添加上面的自定义注解

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class LimitQuotaStatistics extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** id */
    private Long id;

    /** 部门id */
    private Long deptId;

    /** 部门名称 */
    @Excel(name = "部门名称")
    private String deptName;

    /** 夜班人数 */
    @Excel(name = "夜班人数")
    private Long nightShiftNum;

    /** 早班人数 */
    @Excel(name = "早班人数")
    private Long morningShiftNum;

    /** 早中班人数 */
    @Excel(name = "早中班人数")
    private Long morningMiddlleShiftNum;

    /** 晚中班人数 */
    @Excel(name = "晚中班人数")
    private Long nightMiddleShiftNum;

    /** 合计人数 */
    @Excel(name = "合计人数")
    private Long totalNum;

    /** 定额人数 */
    @Excel(name = "定额人数")
    private Long quotaNum;

    /** 计划日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planDate;

}

3、通过反射获取对象属性的注解以及注解的值

field.getAnnotation(Excel.class).name()

具体示例:

    /**
     * 检查对象的属性是否为空
     * @param obj 检查对象
     * @param checkField 要检查的属性名list
     * @return 为空的属性名list
     * @throws IllegalAccessException
     */
    public static List<String> checkObjFieldIsNull(Object obj, List<String> checkField) throws IllegalAccessException {

        List<String> res = new ArrayList<>();
        //获取对象的类
        Class<?> aClass = obj.getClass();
        //获取对象的所有字段,包含public、private和proteced
        Field[] declaredFields = aClass.getDeclaredFields();
        //筛选出包含在要检查的list 并且 属性为null的字段
        Arrays.stream(declaredFields).forEach(field -> {
            //设置属性可访问
            field.setAccessible(true);
            try {
                if(checkField.contains(field.getName()) && field.get(obj) == null){
                    //获取自定义注解标识的属性名 如果没有则忽略
                    res.add(field.getAnnotation(Excel.class).name()); 
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });
        return res;
    }

测试结果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中通过反射+自定义注解判断对象中部分属性是否为空,返回为空字段的名称或自定义含义 的相关文章

随机推荐

  • 我国常用的投影坐标系_ArcGIS中的坐标系

    点击上方 蓝字 带你去看小星星 今天将解决以下问题 1 分清地理坐标系和投影坐标系 2 什么地区选什么带号 3 如何使用有关 坐标系 的三个工具 今天的内容有点多 咱一次性说明白 可以先收藏 之后遇到再翻也方便 暗示收藏 转发 再看 Arc
  • 关于蓝桥杯的乱七八糟的话(经验、心得、建议、技巧)

    参赛经验 心得 先介绍一下自身情况 我参加的是C C B组 所在的赛区是江苏赛区 参加过三次蓝桥杯 最好的成绩是国三 没错我就是个小辣鸡 蓝桥杯省赛题目一般有结果填空 代码填空和程序题三种题型 但是第十届已经没有了代码填空 填空题只要结果
  • leaftlet 中Polygon的使用属性

    绘制一个面 var latlngs 37 109 05 41 109 03 41 102 05 37 102 04 var polygon L polygon latlngs color red addTo map map fitBound
  • videopose3d制作自己的视频转换

    videopose3d制作自己的视频转换 最近学了深度学习 对其中的人体姿态检测和识别感兴趣 但是网上包括官方网站的都是对源码的解读 没有一个是利用自己的视频进行姿态检测和渲染的 因此自己试着按照官方的in the wild教程试了一下 很
  • Python开发图形可视化界面程序(一)

    前言 近来使用Python开发了一些简单的辅助脚本 发现这真的是一门很有趣的语言 于是乎 便想着使用python来开发一些具有图形可视化界面 GUI 的程序 对于python来说 支持其开发GUI可视化程序的框架非常之多 简直让人眼花燎原
  • bugfree pdo mysql扩展模块_windows平台bugfree3.0.3搭建心得(nginx+php+mysql+bugfree+RunHiddenConsole)...

    之前没做过windows服务器管理 我的认识还停在个人用户操作系统的认知上 这次搭建bugfree环境 挺多麻烦的 在安装之前 我百度的bugfree搭建大多是使用xampp集成环境的安装方法 然后我就照做 下载xampp 然后安装到系统c
  • C语言实现两数相加的三种方法

    笔试题里面看到的 总结一下 分享给需要的小伙伴 一 原始办法 这种方法最直观明了 int add int x int y return x y 二 利用printf的返回值 这个操作鲜为人知 include
  • linux域名解析

    linux域名解析 首先确保你的电脑可以连上网 服务端和客户端能够连通 1 本地解析 优先级高 在服务端中 ping www baidu com 找出ip 在客户端中的浏览器中搜索ip地址就可以上网 但是ip地址记起来非常不方便 所以这里用
  • 网贷风控体系之-风控模型

    网贷风控体系之 风控模型 大数据风控模型主要分为两类 反欺诈模型 交叉验证 聚类分析 黑灰名单 二元好坏模型 准入阶段 授信额度期限利率模型 评分卡模型 LR XGBoost 贷中阶段 风险变化评估 风险预警 贷后阶段 催收时机 催收方法
  • TVM:源码编译安装

    TVM Linux源码编译安装 笔者环境 OS Ubuntu 18 04 CMake 3 10 2 gcc 7 5 0 cuda 11 1 编译安装过程总览 本文将简介 tvm 的编译安装过程 包含两个步骤 通过C 代码构建共享库 设置相关
  • Android - BlueTooth BLE 之 Central 与 Peripheral

    一 前言 Andorid 5 0 之前是无法进行 外围设备开发的 在Android 5 0 API 21 android bluetooth le包下 新增加 Scaner相关类和 Advertiser 相关类 目前最后使用Scanner相
  • 49天精通Java,第5天,Java控制台输入输出语句

    目录 一 控制台输出 二 读取输入 三 格式化输出 1 类型转换字符 2 代码实例
  • 搭建github服务器_【教程篇】使用GitHub+Hexo搭建个人静态博客

    嗨 大家好 你们的万金油管家小e又来了 这次就教大家一些利用GitHub和Hexo本地服务器搭建个人博客的教程 可能教程要好几期 那么这期就先从最最基础的GitHub的注册 以及本地环境的搭建 GitHub仓库的建立等等开始 近年来很多人都
  • 十大应用安全威胁

    常见应用安全威胁 OWASP TOP 10 2013 注入 失效的身份认证和会话管理 跨站脚本攻击 XSS 不安全的直接对象引用 安全配置错误 敏感信息泄露 功能级访问控制缺失 跨站请求伪造 CSRF 使用含有已知漏洞的组件 未验证的重定向
  • 【MyBatis】MyBatis 二级缓存全详解

    1 概述 转载 MyBatis 二级缓存全详解 上一篇文章中我们介绍到了 MyBatis 一级缓存其实就是 SqlSession 级别的缓存 什么是 SqlSession 级别的缓存呢 一级缓存的本质是什么呢 以及一级缓存失效的原因 我希望
  • Ubuntu扩展存储合理分配swap分区

    文章目录 前言 1 为Ubuntu扩存 外部存储 1 1修改存储 1 2 初始化分配的磁盘 2 为Ubuntu调整swap分区大小 总结 前言 我们在Ubuntu上运行某些大型游戏或者编译一些工程代码的时候 往往会遇到内存或外部存储不够导致
  • mac 本地运行 http-proxy-middleware ,请求超时

    const http require http customer target http 10 10 111 192 8080 target http user jinfu baohan com changeOrigin true 是否启用
  • JS如何将变量作为一个对象的Key

    JS如何将变量作为一个对象的Key var lastWord last word var a first word hello lastWord world a first word hello a lastWord world a las
  • Mysql进阶优化篇06——分组查询优化、分页查询优化、覆盖索引

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 mysql基础 进阶 主要讲解mysql数据库sql刷题 进阶知识 包括索引 数据库调优 分库分表等 文章简介 本文将介绍JOIN语句的底层原理
  • Java中通过反射+自定义注解判断对象中部分属性是否为空,返回为空字段的名称或自定义含义

    场景 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出 霸道流氓气质的博客 CSDN博客 在上