分布式ID存库和展示给前端防止损失精度使用注解的一种写法

1.前端传递的参数为字符串,dto里面的字符串要转换为long类型,可以用如下注解的方式转换:

package com.cmft.cmooc.screen.common;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class IdDeserializer extends JsonDeserializer<Long> {
    @Override
    public Long deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        return p.getValueAsLong();
    }
}

 

2.后端查询出来的分布式ID为long类型的展示给前端,为了以防损失精度,要转换成字符串给前端,其中一种写法如下:

package com.cmft.cmooc.screen.common;

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

import java.io.IOException;

public class IdSerializer extends JsonSerializer<Long> {
    @Override
    public void serialize(Long value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException {
        gen.writeString(String.valueOf(value));
    }
}

案例如下:

 

 

注:就是数据库查询出来的id值(是通过雪花算法生成的一个19为随机数字)  ,在传给前端的时候,前端同事用谷歌浏览器看的是Response返回的是后端的正确数据,但是preview选项卡是另外一个值,位数虽然是相同的,但是好像变小了。这种情况就叫做精度丢失。

 

也有如下一种写法:

在要返给前端的实体类字段上添加注解:
@JsonFormat(shape =JsonFormat.Shape.STRING)
@ApiModelProperty("预算ID")
Long budgetId;

 

posted @ 2020-08-17 17:59  卡不搬砖  阅读(256)  评论(0)    收藏  举报