在 Java 后端開發中,可能會遇到前后端交互過程中 Long 類型精度丟失的問題。尤其是在 JavaScript 中,由于其 Number 類型是雙精度浮點數,超過 16 位的 Long 類型值就會發生精度丟失。
問題背景
假設有如下實體類:
public class TemplateValue implements Serializable {private Long colHeadId;private Long rowHeadId;private String val1;private String val2;
}
這在后端沒有問題,但如果前端直接接收這個數據,colHeadId
和 rowHeadId
可能會在 JS 中出現精度問題,比如:
{"colHeadId": 1234567890123456789
}
1234567890123456770 // 精度丟失!
解決方案:Long 類型轉 String 傳給前端
為了解決這個問題,我們需要在序列化時將 Long 類型轉成 String,即使用:
@JsonSerialize(using = ToStringSerializer.class)
同時,前端傳來的 String 要轉回 Long 怎么辦?
這就是本文的重點!序列化做了,反序列化沒做,就會出現類型轉換失敗或數據無法接收的問題。
那么我們需要自定義一個反序列化器,將前端傳來的 String 自動轉成 Long 類型。
實現步驟
1.創建自定義反序列化器 ToLongDeserializer
可以放在工具類里
package com.yourproject.util;import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;public class ToLongDeserializer extends JsonDeserializer<Long> {@Overridepublic Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {String value = p.getText();try {return value != null ? Long.parseLong(value) : null;} catch (NumberFormatException e) {throw new IOException("Invalid long value: " + value, e);}}
}
2. 在實體類上使用序列化 & 反序列化注解
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yourproject.util.ToLongDeserializer;public class TemplateValue implements Serializable {@JsonSerialize(using = ToStringSerializer.class)@JsonDeserialize(using = ToLongDeserializer.class)private Long colHeadId;@JsonSerialize(using = ToStringSerializer.class)@JsonDeserialize(using = ToLongDeserializer.class)private Long rowHeadId;private String val1;private String val2;
}
這樣,在前后端交互時就能做到:
-
后端返回數據時將 Long -> String,避免精度丟失;
-
后端接收前端數據時將 String -> Long,方便業務邏輯處理。
總結
前后端交互中,涉及 Long 類型字段時:
-
必須序列化為 String,@JsonSerialize(using = ToStringSerializer.class),避免前端精度丟失
-
如果需要將數據回傳給后端,必須反序列化為 Long,創建自定義反序列化器,確保后端能正常接收