zoukankan      html  css  js  c++  java
  • 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;
      //其他属性略
    
    }

    这样可以完美解决。

    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    add custom attribute to standard windows controls
    产生0到1之间均匀分布的一个随机数与随机数序列
    (HDOJ 1002)A + B Problem II
    递推问题系列1幂积序列
    杭电题目分类解答
    (HDOJ 1003)Max Sum
    快排序(递归算法)
    (HDOJ 1004)Let the Balloon Rise
    (HDOJ 1005)Number Sequence
    一个关于去除数组重复元素的问题(C语言实现)
  • 原文地址:https://www.cnblogs.com/zys2019/p/15046555.html
Copyright © 2011-2022 走看看