From 018be292d970ec06d4aff4daa5e872fcbdcea1f2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 20 Dec 2025 15:45:11 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E3=80=91TimestampLocalDateTimeSerializer=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=B8=8B=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimestampLocalDateTimeSerializer.java | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java index 2b2c2948ff..4e422feefd 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalDateTimeSerializer.java @@ -1,11 +1,14 @@ package cn.iocoder.yudao.framework.common.util.json.databind; +import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; +import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.lang.reflect.Field; @@ -21,28 +24,13 @@ import java.util.concurrent.ConcurrentHashMap; * * @author 老五 */ +@Slf4j public class TimestampLocalDateTimeSerializer extends JsonSerializer { public static final TimestampLocalDateTimeSerializer INSTANCE = new TimestampLocalDateTimeSerializer(); private static final Map, Map> FIELD_CACHE = new ConcurrentHashMap<>(); - private Map buildFieldMap(Class clazz) { - Map fieldMap = new HashMap<>(); - for (Field field : ReflectUtil.getFields(clazz)) { - String fieldName = field.getName(); - JsonProperty jsonProperty = field.getAnnotation(JsonProperty.class); - if (jsonProperty != null) { - String value = jsonProperty.value(); - if (!value.isEmpty() && !"\u0000".equals(value)) { - fieldName = value; - } - } - fieldMap.put(fieldName, field); - } - return fieldMap; - } - @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { // 情况一:有 JsonFormat 自定义注解,则使用它。https://github.com/YunaiV/ruoyi-vue-pro/pull/1019 @@ -53,13 +41,16 @@ public class TimestampLocalDateTimeSerializer extends JsonSerializer clazz = currentValue.getClass(); Map fieldMap = FIELD_CACHE.computeIfAbsent(clazz, this::buildFieldMap); Field field = fieldMap.get(fieldName); + // 进一步修复:https://gitee.com/zhijiantianya/ruoyi-vue-pro/pulls/1480 if (field != null && field.isAnnotationPresent(JsonFormat.class)) { JsonFormat jsonFormat = field.getAnnotation(JsonFormat.class); try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(jsonFormat.pattern()); gen.writeString(formatter.format(value)); return; - } catch (Exception ignored) { + } catch (Exception ex) { + log.warn("[serialize][({}#{}) 使用 JsonFormat pattern 失败,尝试使用默认的 Long 时间戳]", + clazz.getName(), fieldName, ex); } } } @@ -69,4 +60,26 @@ public class TimestampLocalDateTimeSerializer extends JsonSerializer buildFieldMap(Class clazz) { + Map fieldMap = new HashMap<>(); + for (Field field : ReflectUtil.getFields(clazz)) { + String fieldName = field.getName(); + JsonProperty jsonProperty = field.getAnnotation(JsonProperty.class); + if (jsonProperty != null) { + String value = jsonProperty.value(); + if (StrUtil.isNotEmpty(value) && ObjUtil.notEqual("\u0000", value)) { + fieldName = value; + } + } + fieldMap.put(fieldName, field); + } + return fieldMap; + } + }