后端传Long类型的值给前端vue,导致精度丢失为问题的解决

数据设计使用bigint 类型作为主键,Java后台使用Long 类型进行接收。

在前端vue中调用后端的通过id查询方法,进行对数据库中的数据查询时,发现后端查询不到数据,后经发现:
用psotman对后端的查询服务进行测试,无问题。
查看前端vue获取的数据id时,发现获取的数据id和数据库中的数据的Id 不一致。
所以才会导致查询查不到数据
由此引导出下面的问题:
javascript 的 Number 类型最大长度是17位;
mysql 使用bigint 类型长度是20位;

解决办法:配置一个配置类。用于Java传值给前端进行JSON序列化时,将Long 类型转成string 类型序列化。

@Configuration
@EnableWebMvc
public class CustomJsonConfiguration implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> 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);
    }
}
上一篇:java中redisTemplate操作redis


下一篇:RedisTemplate配置的jackson.ObjectMapper里的一个enableDefaultTyping方法过期解决