controller接口参数使用自定义注解修改传入值_java自定义注解修改controller入参-程序员宅基地

技术标签: spring  java  json  开发语言  

@valid和@validated可以加在接口参数上自定义参数检查,那么接口参数也可以使用这种形式进行修改。
1.使用aop,自定义两个注解,一个注解A用来标识哪个参数需要修改,另一个B注解标识修改成什么内容。
2.只能使用post请求的接口可用
实现思路:
1.利用aop切面拦截到A注解标识的接口参数,反射获取A注解参数的类字段集合;检查字段集合上的注解,如果被B标识,存储起来如{name.name1:[B]},
如果被A标识,重复上述操作。最终获取到被B注解标识的字段集合[{name.name1:[B]},{name.name2.name21:[B]}]。
2.将接口传进来的json转jsonObject,一层一层压栈,同时和上面一样形式组织名称name.name1,如果发现名称和步骤1存储起来的名称一致,说明此字段需要修改值,直接改jsonobject的value
3.返回修改后的json
在这里插入图片描述

简单实现
思路1:获取被注解标识的类字段,并组织名称存储起来

while (!stack.isEmpty()){
    
            StringBuilder fatherName = new StringBuilder();
            MyField field = stack.pop();
            Convert annotation = field.getField().getAnnotation(Convert.class);
            if (annotation!=null){
    
                fatherName.append(field.getName());
                Type genericType = field.getField().getGenericType();
                if (genericType instanceof ParameterizedType){
    
                    genericType = ((ParameterizedType) genericType).getActualTypeArguments()[0];
                }
                try {
    
                    Class<?> genericTypeClass = Class.forName(genericType.getTypeName());
                    Field[] genericTypeClassDeclaredFields = genericTypeClass.getDeclaredFields();
                    for (int i = 0; i < genericTypeClassDeclaredFields.length; i++) {
    
                        MyField field1 = MyField.builder()
                                .name(field.getName() + "." + genericTypeClassDeclaredFields[i].getName())
                                .field(genericTypeClassDeclaredFields[i])
                                .build();
                        stack.push(field1);
                    }
                    continue;
                } catch (ClassNotFoundException e) {
    
                   throw new BadRequestException("class forname fail!");
                }
            }
            Annotation[] annotations = field.getField().getAnnotations();
            if (annotations==null||annotations.length<=0){
    
                continue;
            }
            Trim trim = field.getField().getAnnotation(Trim.class);
            if (trim!= null){
    
                fieldMap.put(field.getName(), field.getName());
            }
        }

思路2:解析json,匹配上一步的存储起来的要修改的字段

while (!stack1.isEmpty()){
    
            MyParam pop = stack1.pop();
            JSONObject jsonObject1 = pop.getJsonObject();
            Iterator<Map.Entry<String, Object>> iterator = jsonObject1.entrySet().iterator();
            while (iterator.hasNext()){
    
                Map.Entry<String, Object> next = iterator.next();
                String key = next.getKey();
                String newKey = key;
                if (StringUtils.isNotBlank(pop.getName())){
    
                    newKey = pop.getName()+"."+newKey;
                }
                Object value = next.getValue();
                if (value instanceof JSONObject){
    
                    MyParam build1 = MyParam.builder()
                            .name(newKey)
                            .jsonObject((JSONObject) value)
                            .build();
                    stack1.push(build1);
                }else if (value instanceof JSONArray){
    
                    Iterator<Object> iterator1 = ((JSONArray) value).iterator();
                    while (iterator1.hasNext()){
    
                        JSONObject next1 = (JSONObject)iterator1.next();
                        MyParam build1 = MyParam.builder()
                                .name(newKey)
                                .jsonObject(next1)
                                .build();
                        stack1.push(build1);
                    }
                }else {
    
                    if (fieldMap.containsKey(newKey)){
    
                        String trim = jsonObject1.get(key).toString().trim();
                        jsonObject1.put(key,trim);
                        log.info(newKey+"====================");
                    }
                }
            }
        }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44807009/article/details/126686565

智能推荐

Android-SpinKit 加载进度条(登录,网络请求)_com.github.ybq:android-spinkit-程序员宅基地

文章浏览阅读5k次。Gradle 配置:allprojects { repositories { maven { url "https://jitpack.io" } }}compile 'com.github.ybq:Android-SpinKit:1.0.5'就这么些配置下来是代码:XML:com.github.ybq.android._com.github.ybq:android-spinkit

匈牙利算法(Kuhn-Munkres)算法_匈牙利匹配 深度学习-程序员宅基地

文章浏览阅读3.1w次,点赞43次,收藏188次。个人感觉匈牙利算法(KM算法)并不好理解,想搞懂需要花一些时间。如果只是想用,那直接使用Matlab版本的链接里的代码即可几个非常有用的连接:1 https://www.topcoder.com/community/data-science/data-science-tutorials/assignment-problem-and-hungarian-algorithm/#!2..._匈牙利匹配 深度学习

UDP 的广播,组播和点播_udp广播和组播的区别-程序员宅基地

文章浏览阅读7k次,点赞2次,收藏30次。1:说明使用UDP协议进行信息的传输之前不需要建立连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信..._udp广播和组播的区别

克莱姆V(克莱姆相关系数、克莱姆关联系数、独立系数)的MATLAB计算_cramer's v-程序员宅基地

文章浏览阅读2.1w次,点赞11次,收藏32次。前些时间需要衡量多个分类数据之间两两相关程度,想找出最相关的一对分类数据;于是想到了曾经看过的克莱姆相关系数,但在网上搜了好久之后,即没发现Matlab现成的built-in函数,也没找到别人分享的Matlab代码,于是决定自己动手写一个~ 克莱姆V(Cramer’s V),又称为克莱姆相关系数、克莱姆关联系数、独立系数等,是双变量相关分析的一种方法,专门用于衡量..._cramer's v

android Camera2 API适配百度人脸识别SDK_nv21格式人脸图片下载-程序员宅基地

文章浏览阅读513次。Camera2 API替换Camera API之后的问题camera和camera2的最主要区别之一就是camera2不再支持nv21的输出,通常我们为了使视频预览更加的流畅,会采用YUV_420_888的输出格式,以下是一段camera2的设置代码片段... mImageReader = ImageReader.newInstance(width, height, ImageFormat.YUV_420_888, 2) mImageReader?.setOnImageAvailableList_nv21格式人脸图片下载

/etc/resolv.conf中内容被清空的解决办法-程序员宅基地

文章浏览阅读2.4k次。这里主要解决一个问题,那就是每次重启计算机之后resolv.conf 里面配置的域名地址 也就是nameserver DNS的信息被清空,网上查了查才知道是network manager 搞得鬼;网上有两种解决办法:一:禁用network manager 就是下面第一种: 停止network manager服务,防止其在启动时重写/etc/resolv.conf文件..._vi /etc/resolv.conf里面没内容

随便推点

python能做什么项目好-你用 Python 做过什么有趣的数据挖掘项目?-程序员宅基地

文章浏览阅读350次。有网友在知乎提问:「你用 Python 做过什么有趣的数据挖掘项目?」我最近刚开始学习 Python, numpy, scipy 等, 想做一些数据方面的项目,但是之前又没有这方面的经验。所以想知道大家都做过什么有趣的项目, 或者有什么好入手的方向推荐下。下面是何明科的分享:第零步:原点,大数据与价值大概一年多以前,和几个小伙伴均认同一个趋势:觉得通过技术手段获取网上越来越丰富的数据,并基于这些数..._python能做些什么有用项目

[MICCAI2019] Robust Multimodal Brain Tumor Segmentation via Feature Disentanglement and Gated Fusion-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏6次。Cheng chen,CUHKIntro针对分割问题中的模态缺失现象。利用 disentanglement的思路,将多模态的输入影像特征,解耦为modality-specific 以及 modality-invariant。在Brats18上进行实验。Method网络框架如下:EcE^cEc编码脑影像的内容信息,得到content code,EaE^aEa编码模态信息,得到appeara..._obust multimodal brain tumor segmentation via feature disentanglement and ga

17.分库分表(三)-分布式主键snowflake_defaultkeygenerator.setworkerid()-程序员宅基地

文章浏览阅读381次。分布式主键默认分布式主键生成器ShardingSphere提供灵活的配置分布式主键生成策略方式。 在分片规则配置模块可配置每个表的主键生成策略,默认使用雪花算法(snowflake)生成64bit的长整型数据。雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同进程主键的不重复性,以及相同进程主键的有序性。在同一个进程中,它首先是通过时间位保证不重复,如果时间相同则是..._defaultkeygenerator.setworkerid()

Collaborative Self-Attention Network for Session-based Recommendation (IJCAI-20_collaborative graph learning for session-based rec-程序员宅基地

文章浏览阅读734次。摘要基于会话的推荐因其能够为匿名用户提供推荐而成为研究热点。但是,现有的基于会话的方法具有以下局限性:(1)它们要么缺乏学习复杂依赖性的能力,要么主要专注于当前会话,而没有明确考虑协作信息。 (2)他们假设商品的表示形式是静态的,并且在每个时间步中对所有用户都是固定的。我们认为,即使是同一项目,也可以在同一时间步骤为不同的用户以不同的方式表示。为此,我们提出了一种新颖的解决方案,用于基于会话的推荐的协作式自我关注网络(CoSAN),以学习会话表示并通过调查邻居会话来预测当前会话的意图。特别地,我们首先通过_collaborative graph learning for session-based recommendation

Ubuntu : 在主机和虚拟机之间传文件-程序员宅基地

文章浏览阅读1.5k次。电脑用的是windows的系统,vmware player打开了一台ubuntu虚拟机,想在它们之间传送文件。在宿主机上安装FTP文件传输软件步骤如下:1.Ubuntu中安装ssh,命令:sudo apt-get install ssh openssh-server2.查看虚拟机中Ubuntu的IP地址,命令:ifconfig 下图就是虚拟机中Ubuntu的IP地..._ubuntu 传输文件到虚拟机

node js 进程守护神forever_nodejs 守护进程 forever-程序员宅基地

文章浏览阅读2.2w次。forever是个啥_nodejs 守护进程 forever

推荐文章

热门文章

相关标签