@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+"====================");
}
}
}
}