原因:
超过17位的最后两位直接丢失,导致拿着丢失精度之后的Id再去后端查数据根本查不到。
java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值).
解决办法一:
在实体类相应字段,使用ToStringSerializer的注解,让系统序列化时,保留相关精度
@JsonSerialize(using=ToStringSerializer.class)
private Long createdBy;
解决办法(二): 比较完美,强烈推荐使用
*这里使用Jackson , 若使用fastjson @JsonFormat注解将失效
使用全局配置,将转换时实现自动ToStringSerializer序列化
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
/**
* 序列换成json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值
*/
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(jackson2HttpMessageConverter);
}
}