分布式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;

浙公网安备 33010602011771号