wwh 1 неделя назад
Родитель
Сommit
d81839bdfb

+ 55 - 0
baqing-shop/src/test/java/com/ruoyi/web/SysDictDataJsonTest.java

@@ -0,0 +1,55 @@
1
+package com.ruoyi.web;
2
+
3
+import com.alibaba.fastjson2.JSON;
4
+import com.ruoyi.common.core.domain.entity.SysDictData;
5
+import java.util.Collections;
6
+import java.util.LinkedHashMap;
7
+import java.util.List;
8
+import org.junit.jupiter.api.Assertions;
9
+import org.junit.jupiter.api.Test;
10
+
11
+class SysDictDataJsonTest
12
+{
13
+    @Test
14
+    void parseArrayIgnoresLegacyDefaultField()
15
+    {
16
+        String json = "[{\"dictLabel\":\"正常\",\"dictValue\":\"0\",\"isDefault\":\"Y\",\"default\":false,\"status\":\"0\"},"
17
+                + "{\"dictLabel\":\"停用\",\"dictValue\":\"1\",\"isDefault\":\"N\",\"default\":false,\"status\":\"0\"}]";
18
+        List<SysDictData> list = JSON.parseArray(json, SysDictData.class);
19
+        Assertions.assertEquals(2, list.size());
20
+        Assertions.assertEquals("正常", list.get(0).getDictLabel());
21
+    }
22
+
23
+    @Test
24
+    void roundTripDoesNotEmitDefaultField()
25
+    {
26
+        SysDictData data = new SysDictData();
27
+        data.setDictLabel("正常");
28
+        data.setDictValue("0");
29
+        data.setIsDefault("Y");
30
+        data.setStatus("0");
31
+
32
+        String json = JSON.toJSONString(Collections.singletonList(data));
33
+        Assertions.assertFalse(json.contains("\"default\""));
34
+
35
+        List<SysDictData> list = JSON.parseArray(json, SysDictData.class);
36
+        Assertions.assertEquals(1, list.size());
37
+        Assertions.assertEquals("0", list.get(0).getDictValue());
38
+    }
39
+
40
+    @Test
41
+    void parseFromLinkedHashMapList()
42
+    {
43
+        LinkedHashMap<String, Object> row = new LinkedHashMap<>();
44
+        row.put("dictLabel", "正常");
45
+        row.put("dictValue", "0");
46
+        row.put("isDefault", "Y");
47
+        row.put("default", false);
48
+        row.put("status", "0");
49
+
50
+        String json = JSON.toJSONString(Collections.singletonList(row));
51
+        List<SysDictData> list = JSON.parseArray(json, SysDictData.class);
52
+        Assertions.assertEquals(1, list.size());
53
+        Assertions.assertEquals("正常", list.get(0).getDictLabel());
54
+    }
55
+}

+ 4 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java

@@ -4,6 +4,8 @@ import javax.validation.constraints.NotBlank;
4 4
 import javax.validation.constraints.Size;
5 5
 import org.apache.commons.lang3.builder.ToStringBuilder;
6 6
 import org.apache.commons.lang3.builder.ToStringStyle;
7
+import com.alibaba.fastjson2.annotation.JSONField;
8
+import com.fasterxml.jackson.annotation.JsonIgnore;
7 9
 import com.ruoyi.common.annotation.Excel;
8 10
 import com.ruoyi.common.annotation.Excel.ColumnType;
9 11
 import com.ruoyi.common.constant.UserConstants;
@@ -129,6 +131,8 @@ public class SysDictData extends BaseEntity
129 131
         this.listClass = listClass;
130 132
     }
131 133
 
134
+    @JSONField(serialize = false, deserialize = false)
135
+    @JsonIgnore
132 136
     public boolean getDefault()
133 137
     {
134 138
         return UserConstants.YES.equals(this.isDefault);

+ 29 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java

@@ -11,6 +11,8 @@ import com.ruoyi.common.constant.CacheConstants;
11 11
 import com.ruoyi.common.core.domain.entity.SysDictData;
12 12
 import com.ruoyi.common.core.redis.RedisCache;
13 13
 import com.ruoyi.common.utils.spring.SpringUtils;
14
+import org.slf4j.Logger;
15
+import org.slf4j.LoggerFactory;
14 16
 
15 17
 /**
16 18
  * 字典工具类
@@ -19,6 +21,8 @@ import com.ruoyi.common.utils.spring.SpringUtils;
19 21
  */
20 22
 public class DictUtils
21 23
 {
24
+    private static final Logger log = LoggerFactory.getLogger(DictUtils.class);
25
+
22 26
     /**
23 27
      * 分隔符
24 28
      */
@@ -48,8 +52,33 @@ public class DictUtils
48 52
         {
49 53
             return null;
50 54
         }
55
+        try
56
+        {
57
+            return parseDictCacheValue(arrayCache);
58
+        }
59
+        catch (Exception ex)
60
+        {
61
+            log.warn("字典缓存解析失败,已清除 key={},原因={}", getCacheKey(key), ex.getMessage());
62
+            removeDictCache(key);
63
+            return null;
64
+        }
65
+    }
66
+
67
+    private static List<SysDictData> parseDictCacheValue(Object arrayCache)
68
+    {
51 69
         if (arrayCache instanceof List)
52 70
         {
71
+            List<?> rawList = (List<?>) arrayCache;
72
+            if (rawList.isEmpty())
73
+            {
74
+                return new java.util.ArrayList<>();
75
+            }
76
+            if (rawList.get(0) instanceof SysDictData)
77
+            {
78
+                @SuppressWarnings("unchecked")
79
+                List<SysDictData> typed = (List<SysDictData>) arrayCache;
80
+                return typed;
81
+            }
53 82
             return JSON.parseArray(JSON.toJSONString(arrayCache), SysDictData.class);
54 83
         }
55 84
         if (arrayCache instanceof JSONArray)