切面更改入参

2023-11-13

定义一个注解 

package com.huaxia.bigdata.bi.common.annotation;


import com.zeekr.bigdata.bi.common.constant.Constant;
import com.zeekr.bigdata.bi.common.enums.MetadataTypeEnum;
import com.zeekr.bigdata.bi.common.enums.SeriesTypeEnum;
import org.springframework.validation.annotation.Validated;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 将code拆分出来
 * @author sol
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})
public @interface SplitParam {

    /**
     * 分隔符,默认为英文逗号
     */
    String separativeSign() default Constant.SEPARATIVE_SIGN_COMMA;
}

切面类,将参数里面的字段进行拆分

package com.huaxia.bigdata.bi.common.aop;


import com.zeekr.bigdata.bi.common.annotation.SplitParam;
import com.zeekr.bigdata.bi.common.constant.Constant;
import com.zeekr.bigdata.bi.common.util.StringUtil;
import com.zeekr.bigdata.bi.privilege.annotation.RowPrivilegeProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

/**
 * 对请求参数进行校验
 *
 * @author: sol
 * @date: 2023/3/28 15:40
 */
@Slf4j
@Aspect
@Component
public class ParameterCheckAspect {


//    @Pointcut("@within(com.zeekr.bigdata.bi.common.annotation.SplitParam)")
//    public void pointcutWithin(){
  //  }
 
 //   @Around("pointcutWithin()") 


    @Around("execution(* com.zeekr.bigdata.bi..*.controller..*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 内部 访问不进行校验
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (null == requestAttributes) {
            return joinPoint.proceed();
        }
        if (joinPoint.getArgs().length == 0) {
            return joinPoint.proceed();
        }
        // 获取拦截方法的第一个参数
        Object inParam = joinPoint.getArgs()[0];

        Set<String> fieldNameSet = new HashSet<>(16);
        Set<Field> fieldList = new HashSet<>(16);
        Class<?> doClass = inParam.getClass();
        // 考虑父类和子类会有相同的字段,所以在这做一层过滤
        while (doClass != Object.class) {
            ReflectionUtils.doWithFields(doClass, field -> {
                if (fieldNameSet.add(field.getName())) {
                    fieldList.add(field);
                }
            });
            doClass = doClass.getSuperclass();
        }
        for (Field field : fieldList) {
            SplitParam annotation = field.getAnnotation(SplitParam.class);
            if (null != annotation) {
                splitParam(inParam, field, annotation.separativeSign());
            } else if ("carTypeList".equals(field.getName())) {
                // carTypeList没有添加注解,所以需要单独处理
                splitParam(inParam, field, Constant.SEPARATIVE_SIGN_COMMA);
            }
        }

        return joinPoint.proceed();

    }


    /**
     * 将code以逗号为间隔拆分出来
     *
     * @param field
     * @param separativeSign
     * @author: e-Yuanhui.Ji
     * @date: 2023/8/15 18:24
     */
    private static void splitParam(Object obj, Field field, String separativeSign) {
        try {
            Class clazz = obj.getClass();
            // 将字段访问设置为真
            field.setAccessible(true);
            // 判断是否为集合类型
            if (field.getType().equals(List.class)) {
                // 获取字段真实类型,直接将field强转为List行不通
               // Method m = clazz.getMethod("get" + StringUtil.firstToUpper(field.getName()));

               // List<String> inputList = (List<String>) m.invoke(obj);


                List<String> inputList =  (List<String>)field.get(obj);
                // 如果参数为空则将字典表里面的数据填充进去
                List<String> resultList = null;
                if (CollectionUtils.isNotEmpty(inputList)) {
                    resultList = new ArrayList<>(16);
                    for (String item : inputList) {
                        if (StringUtils.isBlank(item)) {
                            continue;
                        }
                        resultList.addAll(Arrays.asList(item.split(separativeSign)));
                    }
                }
                field.set(obj, resultList);
            }
        } catch (Exception e) {
            log.error("BaseRequestAspect.checkCarTypeList() exception => 【inParam = {}】, 【fieldName = {}】", obj, field.getName(), e);
        }
    }

 
}

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

切面更改入参 的相关文章

  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 按键时关闭 ModalWindow

    我希望能够在用户按下某个键 在我的例子中是 ESC 时关闭 ModalWindow 我有一个用于按键的 Javascript 侦听器 它调用取消按钮 ID 的单击事件 jQuery modalWindowInfo closeButtonId
  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • 2022年十月份电赛OpenMV巡线方案(2)---主控代码详细分析

    前言 1 继上一篇 2022年十月份电赛OpenMV巡线方案详细代码分析 1 2 这个代码适用于所有主控 只需要更改一下串口接收部分的API 别问我某某MCU能不能跑的这种废话 3 本文使用的协议与正点原子的串口通讯协议一致 看不懂的建议学
  • 当前系统环境打成tar包

    当前系统环境打成tar包 原文地址 https www cnblogs com alexkn p 3879540 html 命令 tar numeric owner exclude proc exclude sys zcvf centos7
  • 【PlayWright教程(一)】安装和使用(python)

    当今常用的三个自动化测试 或者爬虫 库 库 Selenium Puppeteer Playwright JavaScript 支持 官方支持 官方支持 官方支持 Python 异步支持 无 第三方 而且 bug 不少 官方支持 Python
  • 使用bibmap修改bib文件中参考文献的期刊或会议名的字母大小写格式为titlecase

    使用bibmap方便的修改bib文件中参考文献的期刊或会议名的字母大小写格式为titlecase 1 引言 英文语句的字母大小写形式有多种格式 常用的格式是 全大写 upper case 即句子的所有字母都大写 常见于学位论文 报告等的封面
  • system.data.sqlite的源代码下载

    帮助文档 http system data sqlite org index html doc trunk www index wiki 历史版本https system data sqlite org index html doc tru
  • Kendo UI开发教程(14): Kendo MVVM 数据绑定(三) Click

    Click绑定可以把由ViewModel定义的方法不绑定到目标DOM的click事件 当点击目标DOM元素时触发ViewModel的对应方法 例如 使用Click绑定 1
  • Redis有序集合和定时任务解决订单15分钟关闭

    直接上代码 下单减去库存 public String updatePersonStock PageData pd throws Exception Map
  • IPSec协议

    内容提要 Motivation IP协议的安全缺陷 虚拟专用网 IPSec概述 协议流程 SPD SAD 数据封装 IPSec AH IPSec ESP 安全参数协商 ISAKMP IKE 一 Motivation 1 1IP协议的安全缺陷
  • Google Chrome 扩展程序

    Adblock Plus 扩展网址 https chrome google com webstore detail adblock plus free ad bloc cfhdojbkjhnklbpkdaibdccddilifddb 官网
  • uni-app底部导航栏tabBar监听变化以及变换样式

    一 简介 tabBar有三项 点击后两项变换tabBar的样式 二 案例演示 三 代码 1 首先 监听tabBar 点击切换 放在这三个页面 和onLoad同级 页面生命周期onTabItemTap 监听 TabBar 切换点击 onTab
  • SQL计算复购率

    需求背景 订单表中有每笔订单的下单时间 用户ID 订单金额等信息 需要统计每个月在接下来几个月用户复购情况 create table order info order id int primary key user id int amoun
  • CSS样式表中的基本选择器

    样式表中的选择器 作用 用于选则控件 设置样式 常用的样式选择器 一 基础样式选择器 1 id选择器 用 来选择 ps id是唯一的不允许重复 id的名称 样式 值 给id为指定名称的控件 设置样式 css代码如下
  • SQL:开窗排序,在order by 后加判断条件的作用是什么?

    场景 在生产中 经常会看到窗口函数中对排序字段加 is not null 判断 类似这样的sql代码 select row number over partition by id order by amount 1 is not null
  • Python 学习笔记

    1 函数 2 其他 未完待续 1 函数 append 在列表末尾添加一个元素 list append item count 计算指定元素在列表 字符串或元组中出现的次数 for i in uniqueArr nums append arr
  • Weblogic远程代码执行漏洞 CVE-2023-21839

    漏洞简介 WebLogic Core远程代码执行漏洞 CVE 2023 21839 该漏洞允许未经身份验证的远程攻击者通过T3 IIOP协议进行 JNDI lookup 操作 破坏易受攻击的WebLogic服务器 成功利用此漏洞可能导致Or
  • C语言实验(十四):指针(数组排序,数组求平均数、中位数和众数)

    C语言实验 十四 指针 数组排序 数组求平均数 中位数和众数 一 输入10个整数 利用指针分别由小到大排序 由大到小排序 二 输入10个整数 通过指针引用数组 实现三个函数 分别求这10个整数的平均值 中位数 中值 数组名作为函数参数 通过
  • 人机融合的经验与人类的或机器的经验不同

    一 人机融合的经验与人 机器的经验有所不同 人的经验是通过感知 学习思考等方式积累起来的 是基于我们的感官 情感和意识等特点所形成的 人在与世界交互的过程中 通过观察事物 从错误中学习 与他人交流等方式逐渐积累了大量的经验 人类的经验通常包
  • Ubuntu16.04搭建FTP服务器

    1 vsftpd sudo apt get update sudo apt get install vsftpd 2 检查是否安装成功 vsftpd version 二 修改配置文件 1 修改vsftpd conf文件内容 sudo vim
  • ASCII码详解

    ASCII码表 ASCII码大致可以分作三部分組成 第一部分是 ASCII非打印控制字符 第二部分是 ASCII打印字符 第三部分是 扩展ASCII打印字符 第一部分 ASCII非打印控制字符表 ASCII表上的数字0 31分配给了控制字符
  • 切面更改入参

    定义一个注解 package com huaxia bigdata bi common annotation import com zeekr bigdata bi common constant Constant import com z