diff --git a/continew-starter-json/continew-starter-json-jackson/src/main/java/top/continew/starter/json/jackson/util/JSONUtil.java b/continew-starter-json/continew-starter-json-jackson/src/main/java/top/continew/starter/json/jackson/util/JSONUtil.java new file mode 100644 index 00000000..f1d860b6 --- /dev/null +++ b/continew-starter-json/continew-starter-json-jackson/src/main/java/top/continew/starter/json/jackson/util/JSONUtil.java @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *
+ * http://www.gnu.org/licenses/lgpl.html + *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.starter.json.jackson.util;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * json 工具
+ *
+ * @author echo
+ * @since 2025/03/31
+ */
+public class JSONUtil {
+ /**
+ * 私有构造函数,防止实例化。
+ */
+ private JSONUtil() {
+ }
+
+ /**
+ * Jackson 对象映射器,用于 JSON 解析与序列化。
+ */
+ private static final ObjectMapper OBJECT_MAPPER = SpringUtil.getBean(ObjectMapper.class);
+
+ /**
+ * 获取 Jackson 对象映射器。
+ *
+ * @return {@link ObjectMapper} Jackson 对象映射器
+ */
+ public static ObjectMapper getObjectMapper() {
+ return OBJECT_MAPPER;
+ }
+
+ /**
+ * 对象转为 json 字符串
+ *
+ * @param object 对象
+ * @return {@link String }
+ */
+ public static String toJsonStr(Object object) {
+ if (ObjectUtil.isNull(object)) {
+ return null;
+ }
+ try {
+ return OBJECT_MAPPER.writeValueAsString(object);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 将对象转换为 JsonNode。
+ *
+ * @param obj 需要转换的对象
+ * @return 转换后的 {@link JsonNode},如果 obj 为空,则返回 null
+ */
+ public static JsonNode toJson(Object obj) {
+ if (obj == null) {
+ return null;
+ }
+ try {
+ return OBJECT_MAPPER.valueToTree(obj);
+ } catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ /**
+ * 将 List 转换为 JsonNode。
+ *
+ * @param list 输入的 List
+ * @return 转换后的 {@link JsonNode}
+ */
+ public static JsonNode listToJson(List> list) {
+ return toJson(list);
+ }
+
+ /**
+ * 将 Map 转换为 JsonNode。
+ *
+ * @param map 输入的 Map
+ * @return 转换后的 {@link JsonNode}
+ */
+ public static JsonNode mapToJson(Map, ?> map) {
+ return toJson(map);
+ }
+
+ /**
+ * 将 JsonNode 转换为 List
+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.continew.starter.json.jackson.util;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * json 构建工具
+ *
+ * @author echo
+ * @since 2025/03/31
+ */
+public class JsonBuilder {
+
+ private static final ObjectMapper OBJECT_MAPPER = SpringUtil.getBean(ObjectMapper.class);
+ private final ObjectNode rootNode;
+
+ private JsonBuilder() {
+ this.rootNode = OBJECT_MAPPER.createObjectNode();
+ }
+
+ /**
+ * 开始构建
+ *
+ * @return {@link JsonBuilder }
+ */
+ public static JsonBuilder builder() {
+ return new JsonBuilder();
+ }
+
+ /**
+ * 添加 字符串
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, String value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ if (value != null) {
+ rootNode.put(key, value);
+ }
+ return this;
+ }
+
+ /**
+ * 添加 int
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, int value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ rootNode.put(key, value);
+ return this;
+ }
+
+ /**
+ * 添加 long
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, long value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ rootNode.put(key, value);
+ return this;
+ }
+
+ /**
+ * 添加 布尔
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, boolean value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ rootNode.put(key, value);
+ return this;
+ }
+
+ /**
+ * 添加 浮点
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, double value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ rootNode.put(key, value);
+ return this;
+ }
+
+ /**
+ * 添加 json
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, JsonNode value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ if (value != null) {
+ rootNode.set(key, value);
+ }
+ return this;
+ }
+
+ /**
+ * 添加 Object
+ *
+ * @param key key 值
+ * @param value 值
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, Object value) {
+ Objects.requireNonNull(key, "键不能为 null");
+ if (value != null) {
+ rootNode.set(key, OBJECT_MAPPER.valueToTree(value));
+ }
+ return this;
+ }
+
+ /**
+ * 添加 List 到 JSON
+ *
+ * @param key key 值
+ * @param list list 参数
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, List> list) {
+ Objects.requireNonNull(key, "键不能为 null");
+ if (list != null) {
+ ArrayNode arrayNode = OBJECT_MAPPER.createArrayNode();
+ for (Object item : list) {
+ arrayNode.add(OBJECT_MAPPER.valueToTree(item));
+ }
+ rootNode.set(key, arrayNode);
+ }
+ return this;
+ }
+
+ /**
+ * 添加 Map 到 JSON
+ *
+ * @param key key 值
+ * @param map map 参数
+ * @return {@link JsonBuilder }
+ */
+ public JsonBuilder add(String key, Map, ?> map) {
+ Objects.requireNonNull(key, "键不能为 null");
+ if (map != null) {
+ ObjectNode objectNode = OBJECT_MAPPER.valueToTree(map);
+ rootNode.set(key, objectNode);
+ }
+ return this;
+ }
+
+ /**
+ * 构建
+ *
+ * @return {@link JsonNode }
+ */
+ public JsonNode build() {
+ return rootNode;
+ }
+
+ /**
+ * 构建 json 字符串
+ *
+ * @return {@link String }
+ */
+ public String buildString() {
+ try {
+ return rootNode.toString();
+ } catch (Exception e) {
+ throw new RuntimeException("构建 JSON 字符串失败", e);
+ }
+ }
+}
diff --git a/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/handler/AbstractLogHandler.java b/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/handler/AbstractLogHandler.java
index af8598e0..75d982a0 100644
--- a/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/handler/AbstractLogHandler.java
+++ b/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/handler/AbstractLogHandler.java
@@ -166,14 +166,14 @@ public abstract class AbstractLogHandler implements LogHandler {
AccessLogProperties properties = accessLogContext.getProperties().getAccessLog();
// 是否需要打印 规则: 是否打印开关 或 放行路径
if (!properties.isEnabled() || AccessLogUtils.exclusionPath(accessLogContext.getProperties(), ServletUtils
- .getReqPath())) {
+ .getReqPath())) {
return;
}
// 构建上下文
logContextThread.set(accessLogContext);
String param = AccessLogUtils.getParam(properties);
- log.info(param != null ? "[Start] [{}] {} param: {}" : "[Start] [{}] {}", ServletUtils
- .getReqMethod(), ServletUtils.getReqPath(), param);
+ log.info(param != null ? "[Start] [{}] {} param: {}" : "[Start] [{}] {}",
+ ServletUtils.getReqMethod(), ServletUtils.getReqPath(), param);
}
@Override
@@ -185,7 +185,7 @@ public abstract class AbstractLogHandler implements LogHandler {
try {
Duration timeTaken = Duration.between(logContext.getStartTime(), accessLogContext.getEndTime());
log.info("[End] [{}] {} {} {}ms", ServletUtils.getReqMethod(), ServletUtils.getReqPath(), ServletUtils
- .getRespStatus(), timeTaken.toMillis());
+ .getRespStatus(), timeTaken.toMillis());
} finally {
logContextThread.remove();
}
diff --git a/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/util/AccessLogUtils.java b/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/util/AccessLogUtils.java
index 19dc366c..48872fb7 100644
--- a/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/util/AccessLogUtils.java
+++ b/continew-starter-log/continew-starter-log-core/src/main/java/top/continew/starter/log/util/AccessLogUtils.java
@@ -17,7 +17,7 @@
package top.continew.starter.log.util;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.json.JSONUtil;
+import top.continew.starter.json.jackson.util.JSONUtil;
import top.continew.starter.log.model.AccessLogProperties;
import top.continew.starter.log.model.LogProperties;
import top.continew.starter.web.util.ServletUtils;
@@ -26,6 +26,7 @@ import top.continew.starter.web.util.SpringWebUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
/**
* 访问日志工具类
@@ -55,25 +56,24 @@ public class AccessLogUtils {
}
// 参数为空返回空
- Map