Springboot实现自定义注解,接口返回自动增加字段

打印 上一主题 下一主题

主题 968|帖子 968|积分 2904

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 1、创建注解文件:
  1. package com.aiipc.dpm.api.annotation;
  2. import java.lang.annotation.*;
  3. @Target(ElementType.FIELD)
  4. @Retention(RetentionPolicy.RUNTIME)
  5. @Documented
  6. public  @interface Echarts {
  7.     /**
  8.      * 单位
  9.      * @return
  10.      */
  11.     String unit() default "";
  12.     /**
  13.      * 颜色
  14.      * @return
  15.      */
  16.     String color() default "";
  17.     /**
  18.      * 标题
  19.      * @return
  20.      */
  21.     String title() default "";
  22.     /**
  23.      * 第二单位
  24.      * @return
  25.      */
  26.     String sedUnit() default "";
  27. }
复制代码
2、创建拦截器
  1. package com.aiipc.dpm.aspect;
  2. import com.aiipc.common.core.util.ApiResult;
  3. import com.aiipc.common.core.util.ClassUtils;
  4. import com.aiipc.common.core.util.StringUtils;
  5. import com.aiipc.dpm.api.annotation.Echarts;
  6. import com.aiipc.dpm.api.annotation.EchartsDefinition;
  7. import com.alibaba.fastjson.JSON;
  8. import com.alibaba.fastjson.JSONObject;
  9. import lombok.SneakyThrows;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.commons.collections4.CollectionUtils;
  12. import org.apache.commons.lang3.reflect.FieldUtils;
  13. import org.aspectj.lang.JoinPoint;
  14. import org.aspectj.lang.ProceedingJoinPoint;
  15. import org.aspectj.lang.annotation.*;
  16. import org.springframework.core.annotation.AnnotationUtils;
  17. import org.springframework.stereotype.Component;
  18. import java.lang.reflect.Field;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. import java.util.Map;
  22. @Slf4j
  23. @Aspect
  24. @Component
  25. public class EchartsAspect {
  26.     @Pointcut("execution(* com.aiipc.*.controller.*.*(..))")
  27.     public void doPointcut() {
  28.     }
  29.     /**
  30.      * 切点之前
  31.      */
  32.     @Before("doPointcut()")
  33.     public void before(JoinPoint joinPoint) throws Throwable {
  34.         log.info("============ before ==========");
  35.     }
  36.     /**
  37.      * 切点之后
  38.      */
  39.     @After("doPointcut()")
  40.     public void after() throws Throwable {
  41.         log.info("============ after ==========");
  42.     }
  43.     /**
  44.      * 切点返回内容后
  45.      */
  46.     @AfterReturning("doPointcut()")
  47.     public void afterReturning() throws Throwable {
  48.         log.info("============ afterReturning ==========");
  49.     }
  50.     /**
  51.      * 切点抛出异常后
  52.      */
  53.     @AfterThrowing("doPointcut()")
  54.     public void afterThrowing() throws Throwable {
  55.         log.info("============ afterThrowing ==========");
  56.     }
  57.     @Around("doPointcut()")
  58.     public Object around(ProceedingJoinPoint point) throws Throwable {
  59.         log.info("============ around1 ==========");
  60.         Object obj = point.proceed(point.getArgs());
  61.         try {
  62.             if (obj instanceof ApiResult) {
  63.                 ApiResult apiResult = (ApiResult) obj;
  64.                 Object data = apiResult.getData();
  65.                 if (data instanceof List) {
  66.                     List objectList = (List) data;
  67.                     if (CollectionUtils.isEmpty(objectList)) {
  68.                         return apiResult;
  69.                     }
  70.                     List<EchartsDefinition> dictDefinitions = getMetadata(objectList.get(0));
  71.                     if (CollectionUtils.isEmpty(dictDefinitions)) {
  72.                         return apiResult;
  73.                     }
  74.                     List updateList = new ArrayList<>();
  75.                     for (Object o : objectList) {
  76.                         JSONObject jsonObject = doConvertEcharts(o, dictDefinitions);
  77.                         updateList.add(jsonObject);
  78.                     }
  79.                     apiResult.setData(updateList);
  80.                     return apiResult;
  81.                 }
  82.             }
  83.         } catch (Exception e) {
  84.             log.error("TbFlowsDAO查询结果字典转换失败", e);
  85.         }
  86.         log.info("============ around2 ==========");
  87.         return obj;
  88.     }
  89.     @AfterReturning(pointcut = "doPointcut()", returning = "result")
  90.     public void doAfterReturning(JoinPoint pjp, Object result) {
  91.         log.info("============ doAfterReturning ==========");
  92.         log.info("============end  doAfterReturning ==========");
  93.     }
  94.     @SneakyThrows
  95.     private static JSONObject doConvertEcharts(Object target, List<EchartsDefinition> dictDefinitions) {
  96.         JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(target));
  97.         for (EchartsDefinition dictDefinition : dictDefinitions) {
  98.             Echarts dict = dictDefinition.getEcharts();
  99.             String fieldName = dictDefinition.getField().getName();
  100.             // 颜色
  101.             String color = dict.color();
  102.             if (StringUtils.isNotEmpty(color)){
  103.                 jsonObject.put(fieldName.concat("TooltipColor"), color);
  104.             }
  105.             // 单位
  106.             String unit = dict.unit();
  107.             if (StringUtils.isNotEmpty(unit)){
  108.                 Object o = jsonObject.get(fieldName);
  109.                 if (o != null){
  110.                     jsonObject.put(fieldName.concat("TooltipContent"), o.toString().concat(unit));
  111.                 }
  112.             }
  113.             // 标题
  114.             String title = dict.title();
  115.             if (StringUtils.isNotEmpty(title)){
  116.                 jsonObject.put(fieldName.concat("TooltipTitle"), title);
  117.             }
  118.             // 第二单位
  119.             String sedUnit = dict.sedUnit();
  120.             if (StringUtils.isNotEmpty(sedUnit)){
  121.                 jsonObject.put(fieldName.concat("TooltipUnit"), sedUnit);
  122.             }
  123.         }
  124.         return jsonObject;
  125.     }
  126.     /**
  127.      * 仅获取一次Dict元数据,降低多次反射造成的性能消耗
  128.      *
  129.      * @param target 目标实体类
  130.      * @return Dict元数据
  131.      */
  132.     private static List<EchartsDefinition> getMetadata(Object target) {
  133.         List<EchartsDefinition> dictDefinitions = new ArrayList<>();
  134.         if (ClassUtils.isPrimitiveOrWrapper(target.getClass())
  135.                 || target instanceof Map || target instanceof String) {
  136.             return dictDefinitions;
  137.         }
  138.         List<Field> fields = FieldUtils.getAllFieldsList(target.getClass());
  139.         for (Field field : fields) {
  140.             Echarts echart = AnnotationUtils.getAnnotation(field, Echarts.class);
  141.             if (echart != null) {
  142.                 EchartsDefinition dictDefinition = new EchartsDefinition();
  143.                 dictDefinition.setEcharts(echart);
  144.                 dictDefinition.setField(field);
  145.                 dictDefinitions.add(dictDefinition);
  146.             }
  147.         }
  148.         return dictDefinitions;
  149.     }
  150. }
复制代码
3、创建注解定义类
创建这个类是为了遍历结果的时间,防止造成多次循环反射。
  1. package com.aiipc.dpm.api.annotation;
  2. import lombok.Data;
  3. import java.lang.reflect.Field;
  4. @Data
  5. public class EchartsDefinition {
  6.     private Echarts echarts;
  7.     private Field field;
  8. }
复制代码
4、在返回结果的实体类上增加注解
  1. package com.aiipc.dpm.api.vo;
  2. import com.aiipc.dpm.api.annotation.Echarts;
  3. import lombok.Data;
  4. @Data
  5. public class CellsRatioVO {
  6.     String pDate;
  7.     /**
  8.      * pack数量
  9.      */
  10.     @Echarts(unit = "万", color = "rgb(39,154,217)", title= "PACK数量")
  11.     private Double ratioPack;
  12.     /**
  13.      * 合浆投入
  14.      */
  15.     @Echarts(unit = "万", color = "rgb(20,106,248)", title = "合浆投入")
  16.     private Double ratioImport;
  17.     /**
  18.      * 出库
  19.      */
  20.     @Echarts(unit = "万", color = "rgb(139,58,224)", title = "出库")
  21.     private Double ratioOutput;
  22.     /**
  23.      * 比率
  24.      */
  25.     @Echarts(unit = "%", color = "#AE57A4", title = "电芯利用率")
  26.     private String effRatio;
  27.     /**
  28.      * 使用至批次
  29.      */
  30.     private String maxBatchCode;
  31. }
复制代码
5、调用对应的查询接口返回值结果如下:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表