From 164295b6d14d5eb65e3c368c82442409e5f9a59a Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Wed, 15 Apr 2026 15:34:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DDictUtils=E6=9C=AA=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E5=B9=B6=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04-15-DictUtils泛型告警修复后端实施记录.md | 18 ++++++++++ .../com/ruoyi/common/utils/DictUtils.java | 33 ++++++++++++------- .../com/ruoyi/common/utils/DictUtilsTest.java | 20 +++++++++++ 3 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 doc/2026-04-15-DictUtils泛型告警修复后端实施记录.md diff --git a/doc/2026-04-15-DictUtils泛型告警修复后端实施记录.md b/doc/2026-04-15-DictUtils泛型告警修复后端实施记录.md new file mode 100644 index 0000000..23106cc --- /dev/null +++ b/doc/2026-04-15-DictUtils泛型告警修复后端实施记录.md @@ -0,0 +1,18 @@ +# DictUtils 泛型告警修复后端实施记录 + +## 变更时间 +- 2026-04-15 + +## 变更范围 +- `ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java` +- `ruoyi-common/src/test/java/com/ruoyi/common/utils/DictUtilsTest.java` + +## 变更内容 +- 修复 `DictUtils#getDictCache` 中对缓存对象直接强转 `List` 触发的未检查类型转换告警。 +- 调整缓存读取顺序,优先处理 `JSONArray`,避免 JSON 数组被 `List` 分支提前命中后返回非 `SysDictData` 元素。 +- 对普通 `List` 缓存执行逐项类型校验并复制为强类型结果列表。 +- 新增 `JSONArray` 缓存场景测试,覆盖字典缓存反序列化读取逻辑。 + +## 验证结果 +- 执行 `mvn -pl ruoyi-common -Dtest=DictUtilsTest test`,测试通过。 +- 执行 `mvn -pl ruoyi-common -am clean compile`,编译通过,未再出现 `DictUtils.java` 的未检查类型转换告警。 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java index fd02ece..283070b 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DictUtils.java @@ -1,10 +1,11 @@ -package com.ruoyi.common.utils; - -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import com.alibaba.fastjson2.JSONArray; +package com.ruoyi.common.utils; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.alibaba.fastjson2.JSONArray; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.redis.RedisCache; @@ -42,15 +43,25 @@ public class DictUtils public static List getDictCache(String key) { Object cacheObject = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); - if (cacheObject instanceof List) - { - return (List) cacheObject; - } if (cacheObject instanceof JSONArray) { JSONArray arrayCache = (JSONArray) cacheObject; return arrayCache.toList(SysDictData.class); } + if (cacheObject instanceof List) + { + List listCache = (List) cacheObject; + List dictDatas = new ArrayList(listCache.size()); + for (Object item : listCache) + { + if (!(item instanceof SysDictData)) + { + return null; + } + dictDatas.add((SysDictData) item); + } + return dictDatas; + } return null; } diff --git a/ruoyi-common/src/test/java/com/ruoyi/common/utils/DictUtilsTest.java b/ruoyi-common/src/test/java/com/ruoyi/common/utils/DictUtilsTest.java index 3c8e7c7..719b9ae 100644 --- a/ruoyi-common/src/test/java/com/ruoyi/common/utils/DictUtilsTest.java +++ b/ruoyi-common/src/test/java/com/ruoyi/common/utils/DictUtilsTest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import java.util.Collections; import java.util.List; +import com.alibaba.fastjson2.JSONArray; import com.ruoyi.common.core.cache.InMemoryCacheStore; import com.ruoyi.common.core.domain.entity.SysDictData; import com.ruoyi.common.core.redis.RedisCache; @@ -43,4 +44,23 @@ class DictUtilsTest assertEquals("正常", dictCache.get(0).getDictLabel()); assertEquals("0", dictCache.get(0).getDictValue()); } + + @Test + void shouldReturnDictListWhenCacheStoresJsonArray() + { + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + RedisCache redisCache = new RedisCache(new InMemoryCacheStore()); + beanFactory.registerSingleton("redisCache", redisCache); + ReflectionTestUtils.setField(SpringUtils.class, "beanFactory", beanFactory); + + JSONArray jsonArray = JSONArray.parseArray("[{\"dictType\":\"sys_normal_disable\",\"dictLabel\":\"正常\",\"dictValue\":\"0\"}]"); + redisCache.setCacheObject(DictUtils.getCacheKey("sys_normal_disable"), jsonArray); + + List dictCache = DictUtils.getDictCache("sys_normal_disable"); + + assertNotNull(dictCache); + assertEquals(1, dictCache.size()); + assertEquals("正常", dictCache.get(0).getDictLabel()); + assertEquals("0", dictCache.get(0).getDictValue()); + } }