controller接口参数使用自定义注解修改传入值

@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+"====================");
                    }
                }
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值