Commit 2f64b9c85ef72ec7a4192908f2db274d02078967

Authored by zhangdaiscott
1 parent 3435f0e7

字典拦截器性能优化(无@dict注解不走拦截器)

json格式化代码优化
jeecg-boot/jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/aspect/DictAspect.java
... ... @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
4 4 import com.alibaba.fastjson.JSONObject;
5 5 import com.alibaba.fastjson.parser.Feature;
6 6 import com.baomidou.mybatisplus.core.metadata.IPage;
7   -import com.fasterxml.jackson.annotation.JsonFormat;
8 7 import com.fasterxml.jackson.core.JsonProcessingException;
9 8 import com.fasterxml.jackson.databind.ObjectMapper;
10 9 import lombok.extern.slf4j.Slf4j;
... ... @@ -25,7 +24,6 @@ import org.springframework.stereotype.Component;
25 24 import org.springframework.util.StringUtils;
26 25  
27 26 import java.lang.reflect.Field;
28   -import java.text.SimpleDateFormat;
29 27 import java.util.*;
30 28 import java.util.concurrent.TimeUnit;
31 29 import java.util.stream.Collectors;
... ... @@ -46,6 +44,11 @@ public class DictAspect {
46 44 @Autowired
47 45 public RedisTemplate redisTemplate;
48 46  
  47 + @Autowired
  48 + private ObjectMapper objectMapper;
  49 +
  50 + private static final String JAVA_UTIL_DATE = "java.util.Date";
  51 +
49 52 /**
50 53 * 定义切点Pointcut
51 54 */
... ... @@ -60,7 +63,7 @@ public class DictAspect {
60 63 long time2=System.currentTimeMillis();
61 64 log.debug("获取JSON数据 耗时:"+(time2-time1)+"ms");
62 65 long start=System.currentTimeMillis();
63   - this.parseDictText(result);
  66 + result=this.parseDictText(result);
64 67 long end=System.currentTimeMillis();
65 68 log.debug("注入字典到JSON数据 耗时"+(end-start)+"ms");
66 69 return result;
... ... @@ -88,7 +91,7 @@ public class DictAspect {
88 91 * 目前vue是这么进行字典渲染到table上的多了就很麻烦了 这个直接在服务端渲染完成前端可以直接用
89 92 * @param result
90 93 */
91   - private void parseDictText(Object result) {
  94 + private Object parseDictText(Object result) {
92 95 if (result instanceof Result) {
93 96 if (((Result) result).getResult() instanceof IPage) {
94 97 List<JSONObject> items = new ArrayList<>();
... ... @@ -97,13 +100,23 @@ public class DictAspect {
97 100 List<Field> dictFieldList = new ArrayList<>();
98 101 // 字典数据列表, key = 字典code,value=数据列表
99 102 Map<String, List<String>> dataListMap = new HashMap<>(5);
  103 + //取出结果集
  104 + List<Object> records=((IPage) ((Result) result).getResult()).getRecords();
  105 + //update-begin--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
  106 + Boolean hasDict= checkHasDict(records);
  107 + if(!hasDict){
  108 + return result;
  109 + }
100 110  
101   - for (Object record : ((IPage) ((Result) result).getResult()).getRecords()) {
102   - ObjectMapper mapper = new ObjectMapper();
  111 + log.info(" __ 进入字典翻译切面 DictAspect —— " );
  112 + //update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
  113 + for (Object record : records) {
103 114 String json="{}";
104 115 try {
  116 + //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
105 117 //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
106   - json = mapper.writeValueAsString(record);
  118 + json = objectMapper.writeValueAsString(record);
  119 + //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
107 120 } catch (JsonProcessingException e) {
108 121 log.error("json解析失败"+e.getMessage(),e);
109 122 }
... ... @@ -137,10 +150,12 @@ public class DictAspect {
137 150 this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(",")));
138 151 }
139 152 //date类型默认转换string格式化日期
140   - if (CommonConstant.JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
141   - SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
142   - item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
143   - }
  153 + //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
  154 + //if (JAVA_UTIL_DATE.equals(field.getType().getName())&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
  155 + //SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  156 + // item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
  157 + //}
  158 + //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
144 159 }
145 160 items.add(item);
146 161 }
... ... @@ -186,6 +201,7 @@ public class DictAspect {
186 201 }
187 202  
188 203 }
  204 + return result;
189 205 }
190 206  
191 207 /**
... ... @@ -394,4 +410,20 @@ public class DictAspect {
394 410 return textValue.toString();
395 411 }
396 412  
  413 + /**
  414 + * 检测返回结果集中是否包含Dict注解
  415 + * @param records
  416 + * @return
  417 + */
  418 + private Boolean checkHasDict(List<Object> records){
  419 + if(oConvertUtils.isNotEmpty(records)){
  420 + for (Field field : oConvertUtils.getAllFields(records.get(0))) {
  421 + if (oConvertUtils.isNotEmpty(field.getAnnotation(Dict.class))) {
  422 + return true;
  423 + }
  424 + }
  425 + }
  426 + return false;
  427 + }
  428 +
397 429 }
... ...