昨天在测试后台管理系统时通过
id
怎么也查不到数据,然后看了一下发现我的id
根本不是我数据库的id
。后来发现所有id
最后三个数精度会自动丢失,所以不得不把返回给前台的数据换成String
-
把数据库类型改成
varchar
把对象Long
换成String
但是这样的话要改的就太多了太繁琐、麻烦了。(不推荐) -
增加数据类型处理
- 创建
Long
类型字段序列化时转为字符串,避免js丢失精度 的LongJsonSerializer
package com.jjckj.boot.base.serializer; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** * Title: {@link LongJsonSerializer} * Description: Long 类型字段序列化时转为字符串,避免js丢失精度 * * @author 谭 tmn * @email AbelEthan@126.com * @date 2019/6/17 14:39 */ public class LongJsonSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { String str = (value == null ? null : String.valueOf(value)); if (str != null){ jsonGenerator.writeString(str); } } }
- 创建将字符串转为
Long
的LongJsonDeserializer
package com.jjckj.boot.base.serializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import lombok.extern.slf4j.Slf4j; import java.io.IOException; /** * Title: {@link LongJsonDeserializer} * Description: 将字符串转为Long * * @author 谭 tmn * @email AbelEthan@126.com * @date 2019/6/17 14:39 */ @Slf4j public class LongJsonDeserializer extends JsonDeserializer<Long> { @Override public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { String value = jp.getText(); try { return value == null ? null : Long.parseLong(value); } catch (NumberFormatException e) { log.error("解析长整数形错误", e); return null; } } }
* 然后再在
Long
类型上加上注解/** * 主键 */ @JsonSerialize(using = LongJsonSerializer.class) @JsonDeserialize(using = LongJsonDeserializer.class) private Long id;
- 创建
-
重启项目就好了