Java 与 JS 的 long 范围不一致导致的精度丢失问题
在当前项目中,使用了雪花算法自动生成员工id,但是按照id修改员工数据时,前端传入的id有精度缺失,但是后端在分页查询后的数据id值与数据库中保持一致。
失败原因:我们传入的数字是19位,页面js处理long型数字只能精确到前16位,即js对long型数据进行处理时丢失了精度,导致提交的id和数据库中的id不一致。
解决方案
我们可以在服务端给页面响应json数据时进行处理,将long型数据统一转为字符串。
具体实现步骤
1) 提供对象转换器JacksonObjectMapper,基于Jackson进行Java对象到json数据的转换
2) 在WebMvcConfig配置类中扩展Spring mvc的消息转换器,在此消息转换器中使用提供的对象转换器进行Java对象到json数据的转换
@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 扩展mvc框架的消息转换器
* @param converters the list of configured converters to be extended
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("扩展消息转换器...");
//创建消息转换器对象
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
//设置对象转换器,底层使用Jackson将Java对象转为json
messageConverter.setObjectMapper(new JacksonObjectMapper());
//将上面的消息转换器对象追加到mvc框架的转换器集合中
converters.add(0,messageConverter);
}
}