维度使用AOP添加Name

news2024/11/27 0:40:09

1.添加文件
在这里插入图片描述

2.DimName注解,实体使用

package annotation;

import MateTypeEnum;

import java.lang.annotation.*;

/**
 * 字典翻译注解
 *
 * @author pw
 */
@Documented
@Target(ElementType.FIELD)// 可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 运行时有效
public @interface DimName {

    /**
     * 该字段代表字典类型的编码
     */
    //Class clazz() default this.clazz();
    Class<? extends Enum<?>> clazz() default MateTypeEnum.class;

    String type() default "";//DIM-维度 ""-常量

    /**
     * 所映射字段名,没有则覆盖当前字段值
     */
    String fieldName() default "";
}

3.DimVerify注解

package annotation;

import java.lang.annotation.*;

/**
 * @author pw
 */
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DimVerify {
}

3.DimVerifyAspect,aop切面

package aop;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

@Aspect
@Component
@Slf4j
public class DimVerifyAspect {

    @AfterReturning(value = "@annotation( com.mdfp.dim.sdk.annotation.DimVerify)", returning = "obj")
    public void doAround(Object obj) throws Throwable {
        this.getDictValue(obj);
    }

    private void getDictValue(Object data) throws Throwable {
        if (null == data) {
            return;
        }
        List<Object> list;
        if (data instanceof List) {
            list = (List) data;
        } else if (data instanceof Pagination) {
            list = ((Pagination) data).getData();
        } else if (data instanceof IPage) {
            list = ((IPage) data).getRecords();
        } else {
            list = new ArrayList<>();
            list.add(data);
        }
        if (null == list || list.size() == 0) {
            return;
        }
        //反射获取返回date中的属性
        Class<?> clazz = list.get(0).getClass();
        Field[] fieldArr = clazz.getDeclaredFields();
        // 获得父类的字节码对象
        for (Object object : list) {
            for (Field field : fieldArr) {
                //获取属性类型
                if (field.isAnnotationPresent(DimName.class)) {
                    DimName dimName = field.getAnnotation(DimName.class);
                    String methodeName = dimName.fieldName();//默认字段名
                    if (ObjectUtil.isEmpty(methodeName)) {
                        methodeName = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
                    }
                    Object fileldDataO = ReflectionUtils.invokeMethod(object, "get" + methodeName,
                            new Class[]{}, new Object[]{});//获取值
                    if (ObjectUtil.isNotEmpty(fileldDataO)) {
                        Class<Enum> dimNameClazz = (Class<Enum>) Class.forName(dimName.clazz().getName());
                        String type = dimName.type();//DIM-维度 ""-常量
                        if (type.equals("DIM")) {
                            MdfpBaDimObjectDTO mdfpBaDimObjectDTO = DimUtils.getBaDimObjectById(fileldDataO.toString());
                            if (mdfpBaDimObjectDTO != null) {
                                setDimNameData(object, methodeName, mdfpBaDimObjectDTO.getObjectName());
                            }
                        } else {
                            Enum[] objects = dimNameClazz.getEnumConstants();
                            try {
                                Method getCode = dimNameClazz.getMethod("getCode");
                                Method getAlias = dimNameClazz.getMethod("getAlias");
                                for (Enum e : objects) {
                                    Object eCode = getCode.invoke(e);
                                    String eName = e.name();
                                    if ((eName.contains(methodeName) || eName.contains(DataUtils.camelToUnderline(methodeName))) && ObjectUtil.isNotEmpty(eCode)) {
                                        if (eCode.toString().equals(fileldDataO.toString())) {
                                            setDimNameData(object, methodeName, getAlias.invoke(e));
                                        }
                                    }
                                }
                            } catch (Exception e) {
                                log.error("枚举类型没有getCode或getAlias方法");
                            }
                        }
                    }
                }
            }
        }
    }

    public void setDimNameData(Object object, String methodeName, Object data) {
        Method method = null;
        try {
            method = object.getClass().getMethod("set" + methodeName + "Name", String.class);
            if (ObjectUtil.isNotEmpty(data)) {
                method.invoke(object, data.toString());
            }
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }
}

4.实体使用

@DimName(clazz = AbDiApiEnum.class)
    private String interfaceType;//接口类型
@DimName()
    private String state;//状态

5.aop使用

@Override
    @DimVerify
    public IPage<MdfpAbDiApiDTO> selectMaxApiPage(MdfpAbDiApiQueryVO mdfpAbDiApiQueryVO, Integer pageIndex, Integer pageRows) {
        return mdfpAbDiApiMapper.selectMaxApiPage(new Page(pageIndex, pageRows), mdfpAbDiApiQueryVO);
    }
 @ApiOperation(value = "查询最新版本接口API分页列表", notes = "查询最新版本接口API分页列表", httpMethod = "GET")
    @ApiResponses(@ApiResponse(code = 800, message = "ok"))
    @PostMapping(value = "/selectMaxApiPage")
    @DimVerify
    public ResponseData<Pagination<MdfpAbDiApiDTO>> selectMaxApiPage(@RequestBody PaginationRequestData<MdfpAbDiApiQueryVO> requestData) {
        Pagination<MdfpAbDiApiDTO> mdfpAbDiApiDTOPage = mdfpAbDiApiPolyService.selectMaxApiPage(requestData.getParams(), requestData.getPageIndex(), requestData.getPageRows());
        return new ResponseData<>(StatusCodeEnum.SUCCESS_CODE.getStatusCode(), mdfpAbDiApiDTOPage, "查询成功", LanguageEnum.GENERAL_QUERY_SUCCESS.getCode(), new Object[]{});
    }

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

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

相关文章

Angew. Chem. Int. Ed.:Pt/Cu(111)上持续的氢溢出:气体诱导化学过程的动态观察

氢溢出是指游离氢原子从活性金属位点向相对惰性催化剂载体的表面迁移&#xff0c;在涉及氢的催化过程中起着至关重要的作用。然而&#xff0c;对氢原子如何从活性位点溢出到催化剂载体上的全面理解仍然缺乏。 基于此&#xff0c;福州大学林森教授等人报道了利用基于DFT的机器学…

Git 行结束符:LF will be replaced by CRLF the next time Git touches it问题解决指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

访问者模式-操作复杂对象结构

商场里有许多的店铺&#xff0c;大致分为服装区、饮食区及休闲区&#xff0c;每天都会有络绎不绝的不同角色&#xff08;打工人、学生、有钱人&#xff09;的人来逛商场。商场想开发个系统用来模拟这些人的在这些店铺的行为。 public class SuperMarket {public static void m…

Bi-TTCOF-Zn助力CO2还原制CO

精确调控氧化还原单元的组分、空间取向或连接模式对于深入了解高效的人工光合整体反应至关重要&#xff0c;但对于异质结构光催化剂而言&#xff0c;还很难实现。 基于此&#xff0c;华南师范大学兰亚乾教授和陈宜法教授等人报道了一系列用于人工光合综合反应的氧化还原分子结…

从零入门Chrome插件开发

什么是 Chrome 插件 谷歌浏览器在推出时就以其快速、安全和简洁的特点受到了广大用户的欢迎。随着浏览器的不断发展&#xff0c;谷歌为用户提供了插件开发平台&#xff0c;使开发者能够为浏览器添加各种功能和定制化选项。从此&#xff0c;插件成为了提升用户体验和个性化的重…

02|LangChain | 从入门到实战 -六大组件之Models IO

by&#xff1a;wenwenC9 上一篇文章 01&#xff5c;LangChain | 从入门到实战-介绍 一、Models IO 组成及其说明 与语言模型的交互&#xff0c;比如在线GPT系列&#xff0c;或各种离线模型 任何语言模型应用程序的核心元素都是XXX模型。LangChain 提供了与任何语言模型交互的…

[第二章—Spring MVC的高级技术] 2.1Spring MVC配置的替代方案

7.1.1 自定义DispatcherServlet配置 例如&#xff0c;在本章稍后的内容中&#xff08;7.2节&#xff09;&#xff0c;我们将会看到如何在Spring MVC中处理multipart请求和文件上传。 如果计划使用Servlet 3.0对multipart配置的支持&#xff0c;那么需要使用DispatcherServlet的…

​软考-高级-信息系统项目管理师教程 第四版【第16章-项目采购管理-思维导图】​

软考-高级-信息系统项目管理师教程 第四版【第16章-项目采购管理-思维导图】 课本里章节里所有蓝色字体的思维导图

内窥镜项目

★ 手持pad内窥镜项目 项目描述&#xff1a;3D电子内窥镜软件项目是一个基于BS&#xff08;浏览器服务器&#xff09;架构的项目&#xff0c;旨在实现对内窥镜设备的远程控制和高级功能操作。该项目允许操作员使用平板电脑手动触摸屏上的按钮、外部按键或脚踏板 来控制内窥镜设…

[移动通讯]【Carrier Aggregation-11】【5G NR Carrier Aggregation (CA) basics 】

前言&#xff1a; 参考&#xff1a; RF Wireless world 里面的 《5G/NR - Carrier Aggregation》 《5G NR Carrier Aggregation (CA) basics | Carrier Aggregation frequency bands》 This page describes 5G NR Carrier Aggregation (CA) basics. It mentions Carrier Aggre…

Redis 的几种集群对比

文章目录 一、对比分析二、优缺点对比三、总结 如果您对Redis的了解不够深入请关注本栏目&#xff0c;本栏目包括Redis安装&#xff0c;Redis配置文件说明&#xff0c;Redis命令和数据类型说明&#xff0c;Redis持久化配置&#xff0c;Redis主从复制和哨兵机制&#xff0c;Redi…

一些常规的报错和解决方法(持续更新)

一些常规的报错和解决方法&#xff1a; 1、vue创建项目后&#xff0c;项目启动时报错You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included bu…

【JavaEE】实现简单博客系统-前端部分

文件目录&#xff1a; 展示&#xff1a; blog_list.html: <!DOCTYPE html> <html lang"cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><t…

05-SpringBoot中yaml文件的语法格式,在程序中读取yaml文件中数据的方式,yaml文件中引用数据的方式

yaml文件格式 语法格式 YAML(YAML Aint Markup Language)是一种数据序列化格式 , 具有容易阅读、容易与脚本语言交互、以数据为核心即重数据轻格式的特点 YAML数据常见的文件扩展名有yml格式(主流)和yaml格式两种 YAML文件的语法格式: 属性层级关系使用多行和缩进描述(同层…

第十一章《搞懂算法:聚类是怎么回事》笔记

聚类是机器学习中一种重要的无监督算法&#xff0c;可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性&#xff0c;而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…

使用IDEA让文本对比不在变的困难

文章目录 前言操作1、IDEA与电脑磁盘任意文件的比较2、项目内部的文件比较3、剪切板比较4、IDEA本地历史比较5、IDEA版本历史对比 前言 在日常实际开发当中我们常常会对一些代码或内容进行比对查看是否有差异&#xff0c;这个时候不需要借用第三方比对插件&#xff0c;在IDEA中…

ubuntu 20.04 server安装

ubuntu 20.04 server安装 ubuntu-20.04.6-live-server-amd64.iso 安装 安装ubuntu20.04 TLS系统后&#xff0c;开机卡在“A start job is running for wait for network to be Configured”等待连接两分多钟。 cd /etc/systemd/system/network-online.target.wants/在[Servi…

【UE4】UE编辑器乱码问题

环境&#xff1a;UE4.27、vs2019 如何解决 问题原因&#xff0c;UE的编码默认是UTF-8&#xff0c;VS的默认编码是GBK 通过"高级保存选项" 直接修改VS的 .h头文件 的 编码 为 UTF-8 步骤1. 步骤2. 修改编码后&#xff0c;从新编译&#xff0c;然后就可以解决编辑器…

Linux基础环境开发工具的使用(二):动静态库的理解,make,makefile

Linux基础环境开发工具的使用[二] 一.动静态库的初步理解1.库的作用2.Linux和Windows中库的后缀名3.如何在Linux中看一个的库名字4.Linux中和Windows平台怎样支持开发的?5.动静态库的概念6.动静态库的优缺点与补充7.代码验证 二.make,makefile1.功能2.基本语法1.快速使用2.依赖…

SV-704LW 无线WIFI网络音柱

SV-704LW 无线WIFI网络音柱(工业级) 一、描述 SV-704LW是深圳锐科达电子有限公司的一款壁挂式WIFI无线网络音柱&#xff0c;通过WIFI无线接入到WIFI覆盖的网络中&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率可以从30W到6…