From fa3f382210d92197b57d4092e8eb78280f7dd18e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 24 Jan 2021 12:37:58 +0800 Subject: [PATCH] 进一步优化 json 工具类,默认使用 Spring 初始化出来的 --- src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java | 18 ++++++++++++++++++ src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java | 6 +++--- src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JacksonLongSetTypeHandler.java | 45 --------------------------------------------- src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java | 32 ++++++++++++++++++++++++++++++++ src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/AbstractChannelMessageListener.java | 4 ++-- src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisMessageUtils.java | 4 ++-- src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java | 4 ++-- src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java | 4 ++-- src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java | 6 +++--- src/main/java/cn/iocoder/dashboard/util/json/JSONUtils.java | 46 ---------------------------------------------- src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main/java/cn/iocoder/dashboard/util/servlet/ServletUtils.java | 4 ++-- 12 files changed, 128 insertions(+), 107 deletions(-) create mode 100644 src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java delete mode 100644 src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JacksonLongSetTypeHandler.java create mode 100644 src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java delete mode 100644 src/main/java/cn/iocoder/dashboard/util/json/JSONUtils.java create mode 100644 src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java diff --git a/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java b/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java new file mode 100644 index 0000000..27d199a --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java @@ -0,0 +1,18 @@ +package cn.iocoder.dashboard.framework.jackson.config; + +import cn.iocoder.dashboard.util.json.JsonUtils; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JacksonConfig { + + @Bean + @SuppressWarnings("InstantiationOfUtilityClass") + public JsonUtils jsonUtils(ObjectMapper objectMapper) { + JsonUtils.init(objectMapper); + return new JsonUtils(); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java b/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java index 8f5dba0..0855b2b 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java +++ b/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java @@ -11,7 +11,7 @@ import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogF import cn.iocoder.dashboard.framework.security.core.util.SecurityUtils; import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; -import cn.iocoder.dashboard.util.json.JSONUtils; +import cn.iocoder.dashboard.util.json.JsonUtils; import cn.iocoder.dashboard.util.servlet.ServletUtils; import com.google.common.collect.Maps; import io.swagger.annotations.Api; @@ -319,7 +319,7 @@ public class OperateLogAspect { // 被忽略时,标记为 ignore 字符串,避免和 null 混在一起 args.put(argName, !isIgnoreArgs(argValue) ? argValue : "[ignore]"); } - return JSONUtils.toJSONString(args); + return JsonUtils.toJsonString(args); } private static String obtainResultData(Object result) { @@ -327,7 +327,7 @@ public class OperateLogAspect { if (result instanceof CommonResult) { result = ((CommonResult) result).getData(); } - return JSONUtils.toJSONString(result); + return JsonUtils.toJsonString(result); } private static boolean isIgnoreArgs(Object object) { diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JacksonLongSetTypeHandler.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JacksonLongSetTypeHandler.java deleted file mode 100644 index d95ed38..0000000 --- a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JacksonLongSetTypeHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.iocoder.dashboard.framework.mybatis.core.type; - -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; -import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; -import java.util.Set; - -/** - * 参考 {@link com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler} 实现 - * 在我们将字符串反序列化为 Set 并且泛型为 Long 时,如果每个元素的数值太小,会被处理成 Integer 类型,导致可能存在隐性的 BUG。 - * - * 例如说哦,{@link SysUserDO#getPostIds()} 属性 - * - * @author 芋道源码 - */ -public class JacksonLongSetTypeHandler extends AbstractJsonTypeHandler { - - // TODO 芋艿,需要将 Spring 的设置下进来 - private static final ObjectMapper objectMapper = new ObjectMapper(); - - private static final TypeReference> typeReference = new TypeReference>(){}; - - @Override - protected Object parse(String json) { - try { - return objectMapper.readValue(json, typeReference); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - protected String toJson(Object obj) { - try { - return objectMapper.writeValueAsString(obj); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java new file mode 100644 index 0000000..1f57353 --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java @@ -0,0 +1,32 @@ +package cn.iocoder.dashboard.framework.mybatis.core.type; + +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; +import cn.iocoder.dashboard.util.json.JsonUtils; +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.type.TypeReference; + +import java.util.Set; + +/** + * 参考 {@link com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler} 实现 + * 在我们将字符串反序列化为 Set 并且泛型为 Long 时,如果每个元素的数值太小,会被处理成 Integer 类型,导致可能存在隐性的 BUG。 + * + * 例如说哦,{@link SysUserDO#getPostIds()} 属性 + * + * @author 芋道源码 + */ +public class JsonLongSetTypeHandler extends AbstractJsonTypeHandler { + + private static final TypeReference> typeReference = new TypeReference>(){}; + + @Override + protected Object parse(String json) { + return JsonUtils.parseObject(json, typeReference); + } + + @Override + protected String toJson(Object obj) { + return JsonUtils.toJsonString(obj); + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/AbstractChannelMessageListener.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/AbstractChannelMessageListener.java index 98443e4..23b40e2 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/AbstractChannelMessageListener.java +++ b/src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/AbstractChannelMessageListener.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.framework.redis.core.pubsub; import cn.hutool.core.util.ArrayUtil; -import cn.iocoder.dashboard.util.json.JSONUtils; +import cn.iocoder.dashboard.util.json.JsonUtils; import lombok.SneakyThrows; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; @@ -44,7 +44,7 @@ public abstract class AbstractChannelMessageListener i @Override public final void onMessage(Message message, byte[] bytes) { - T messageObj = JSONUtils.parseObject(message.getBody(), messageType); + T messageObj = JsonUtils.parseObject(message.getBody(), messageType); this.onMessage(messageObj); } diff --git a/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisMessageUtils.java b/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisMessageUtils.java index 2db4016..b5cd378 100644 --- a/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisMessageUtils.java +++ b/src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisMessageUtils.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.framework.redis.core.util; import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; -import cn.iocoder.dashboard.util.json.JSONUtils; +import cn.iocoder.dashboard.util.json.JsonUtils; import org.springframework.data.redis.core.RedisTemplate; /** @@ -18,7 +18,7 @@ public class RedisMessageUtils { * @param message 消息 */ public static void sendChannelMessage(RedisTemplate redisTemplate, T message) { - redisTemplate.convertAndSend(message.getChannel(), JSONUtils.toJSONString(message)); + redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message)); } } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java index 18bc788..5b910a6 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.framework.mybatis.core.type.JacksonLongSetTypeHandler; +import cn.iocoder.dashboard.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.dashboard.framework.security.core.enums.DataScopeEnum; import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum; import cn.iocoder.dashboard.modules.system.enums.permission.SysRoleTypeEnum; @@ -71,7 +71,7 @@ public class SysRoleDO extends BaseDO { * * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时 */ - @TableField(typeHandler = JacksonLongSetTypeHandler.class) + @TableField(typeHandler = JsonLongSetTypeHandler.class) private Set dataScopeDeptIds; } diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java index 29a0560..0bff23b 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.framework.mybatis.core.type.JacksonLongSetTypeHandler; +import cn.iocoder.dashboard.framework.mybatis.core.type.JsonLongSetTypeHandler; import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -54,7 +54,7 @@ public class SysUserDO extends BaseDO { /** * 岗位编号数组 */ - @TableField(typeHandler = JacksonLongSetTypeHandler.class) + @TableField(typeHandler = JsonLongSetTypeHandler.class) private Set postIds; /** * 用户邮箱 diff --git a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java index 0bb954c..0b54d45 100644 --- a/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java +++ b/src/main/java/cn/iocoder/dashboard/modules/system/dal/redis/dao/auth/SysLoginUserRedisDAO.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.modules.system.dal.redis.dao.auth; import cn.iocoder.dashboard.framework.security.core.LoginUser; -import cn.iocoder.dashboard.util.json.JSONUtils; +import cn.iocoder.dashboard.util.json.JsonUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository; @@ -22,12 +22,12 @@ public class SysLoginUserRedisDAO { public LoginUser get(String sessionId) { String redisKey = formatKey(sessionId); - return JSONUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), LoginUser.class); + return JsonUtils.parseObject(stringRedisTemplate.opsForValue().get(redisKey), LoginUser.class); } public void set(String sessionId, LoginUser loginUser) { String redisKey = formatKey(sessionId); - stringRedisTemplate.opsForValue().set(redisKey, JSONUtils.toJSONString(loginUser), LOGIN_USER.getTimeout()); + stringRedisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonString(loginUser), LOGIN_USER.getTimeout()); } public void delete(String accessToken) { diff --git a/src/main/java/cn/iocoder/dashboard/util/json/JSONUtils.java b/src/main/java/cn/iocoder/dashboard/util/json/JSONUtils.java deleted file mode 100644 index 8a75217..0000000 --- a/src/main/java/cn/iocoder/dashboard/util/json/JSONUtils.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.iocoder.dashboard.util.json; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; - -/** - * JSON 工具类 - * - * @author 芋道源码 - */ -public class JSONUtils { - - private static ObjectMapper objectMapper = new ObjectMapper(); - - // TODO 芋艿,需要将 Spring 的设置下进来 - public static void setObjectMapper(ObjectMapper objectMapper) { - JSONUtils.objectMapper = objectMapper; - } - - public static String toJSONString(Object object) { - try { - return objectMapper.writeValueAsString(object); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - public static T parseObject(String text, Class clazz) { - try { - return objectMapper.readValue(text, clazz); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public static T parseObject(byte[] bytes, Class clazz) { - try { - return objectMapper.readValue(bytes, clazz); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java b/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java new file mode 100644 index 0000000..d1ef1cd --- /dev/null +++ b/src/main/java/cn/iocoder/dashboard/util/json/JsonUtils.java @@ -0,0 +1,62 @@ +package cn.iocoder.dashboard.util.json; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.Set; + +/** + * JSON 工具类 + * + * @author 芋道源码 + */ +public class JsonUtils { + + private static ObjectMapper objectMapper = new ObjectMapper(); + + /** + * 初始化 objectMapper 属性 + * + * 通过这样的方式,使用 Spring 创建的 ObjectMapper Bean + * + * @param objectMapper ObjectMapper 对象 + */ + public static void init(ObjectMapper objectMapper) { + JsonUtils.objectMapper = objectMapper; + } + + public static String toJsonString(Object object) { + try { + return objectMapper.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(String text, Class clazz) { + try { + return objectMapper.readValue(text, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static T parseObject(byte[] bytes, Class clazz) { + try { + return objectMapper.readValue(bytes, clazz); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static Object parseObject(String text, TypeReference> typeReference) { + try { + return objectMapper.readValue(text, typeReference); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/cn/iocoder/dashboard/util/servlet/ServletUtils.java b/src/main/java/cn/iocoder/dashboard/util/servlet/ServletUtils.java index e3cb86d..35f3d57 100644 --- a/src/main/java/cn/iocoder/dashboard/util/servlet/ServletUtils.java +++ b/src/main/java/cn/iocoder/dashboard/util/servlet/ServletUtils.java @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.util.servlet; import cn.hutool.core.io.IoUtil; import cn.hutool.extra.servlet.ServletUtil; -import cn.iocoder.dashboard.util.json.JSONUtils; +import cn.iocoder.dashboard.util.json.JsonUtils; import org.springframework.http.MediaType; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; @@ -28,7 +28,7 @@ public class ServletUtils { */ @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码 public static void writeJSON(HttpServletResponse response, Object object) { - String content = JSONUtils.toJSONString(object); + String content = JsonUtils.toJsonString(object); ServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE); } -- libgit2 0.21.4