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;
  //其他属性略

}

这样可以完美解决。

就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
原文地址:https://www.cnblogs.com/zys2019/p/15046555.html