1. 程式人生 > 其它 >Long型別在前端丟失精度

Long型別在前端丟失精度

1.問題描述

對錶的主鍵使用的是雪花策略生成的id,在java中的Long型別的,但在前端精度丟失,現象如下:

{
  "id": 1297373218628307972
}

上面假如是後端使用jackson傳遞給前端的,前端接收的id的值卻變成了1297373218628307000。

原因是JavaScript對long型別的解析最多是17位。

2.解決方案

解決辦法就是後端把Long型別轉換成字串型別傳遞給前端,而前端傳遞給後端後再轉換成Long型別去對應資料庫。

1)新建類,把Long型別轉換成字串型別

package com.zxh.configure;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/** * Long 型別欄位序列化時轉為字串,避免js丟失精度 */ public class LongJsonSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException { String text
= (value == null ? null : String.valueOf(value));
if (text != null) { jsonGenerator.writeString(text); } } }

2)新建類,把字串型別轉換成Long型別

package com.zxh.configure;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import lombok.
extern.slf4j.Slf4j; import java.io.IOException; /** * 字串轉為Long */ @Slf4j public class LongJsonDeserializer extends JsonDeserializer<Long> { @Override public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException { String value
= jsonParser.getText(); try { return value == null ? null : Long.parseLong(value); } catch (NumberFormatException e) { log.error("解析長整形錯誤", e); return null; } } }

3)在Long型別的欄位上添加註解

package com.zxh.entity;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ljxx.configure.LongJsonDeserializer;
import com.ljxx.configure.LongJsonSerializer;
import lombok.Data;
import lombok.experimental.Accessors;

import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

@Data
@Accessors(chain = true)
public class User implements Serializable {

    @JsonSerialize(using = LongJsonSerializer.class)
    @JsonDeserialize(using = LongJsonDeserializer.class)
    private Long userId;
  //其他屬性略

}

這樣可以完美解決。

就是這麼簡單,你學廢了嗎?感覺有用的話,給筆者點個贊吧 !