浏览代码

fix: 睡眠打卡时间字段改Date+自定义反序列化器解析HH:mm修复java.sql.Time解析失败

Xiaogang Liao 3 周之前
父节点
当前提交
53440bdfb2
共有 1 个文件被更改,包括 36 次插入0 次删除
  1. 36 0
      cfc-backend/src/main/java/com/etotem/cfc/entity/HealthSleepRecord.java

+ 36 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/HealthSleepRecord.java

@@ -3,7 +3,15 @@ package com.etotem.cfc.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import lombok.Data;
+
+import java.io.IOException;
 import java.io.Serializable;
 import java.util.Date;
 
@@ -14,7 +22,11 @@ public class HealthSleepRecord implements Serializable {
     private Long id;
     private Long memberId;
     private Long checkinId;
+    @JsonFormat(pattern = "HH:mm")
+    @JsonDeserialize(using = HealthSleepRecord.SleepTimeDeserializer.class)
     private Date sleepTime;
+    @JsonFormat(pattern = "HH:mm")
+    @JsonDeserialize(using = HealthSleepRecord.SleepTimeDeserializer.class)
     private Date wakeTime;
     private Integer durationMinutes;
     private Integer deepSleepMinutes;
@@ -24,4 +36,28 @@ public class HealthSleepRecord implements Serializable {
     private Integer dreamCount;
     private String remark;
     private Date createdAt;
+
+    /**
+     * 前端时间选择器传 "HH:mm"(如 21:00),而 JDK 8+ 的 java.sql.Time.valueOf 只接受
+     * "HH:mm:ss" 三段格式;Jackson 2.13 对 java.sql.Time 的 @JsonFormat 反序列化不生效
+     * (String 工厂路径直接调 Time.valueOf),因此自定义解析并补秒。
+     */
+    public static class SleepTimeDeserializer extends JsonDeserializer<Date> {
+        @Override
+        public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+            String v = p.getValueAsString();
+            if (v == null || v.trim().isEmpty()) {
+                return null;
+            }
+            v = v.trim();
+            if (v.length() == 5 && v.charAt(2) == ':') {
+                v = v + ":00";
+            }
+            try {
+                return java.sql.Time.valueOf(v);
+            } catch (IllegalArgumentException e) {
+                throw new JsonMappingException(p, "睡眠时间字段格式错误,期望 HH:mm 或 HH:mm:ss,收到: " + v);
+            }
+        }
+    }
 }