Springboot Long类型返回给前端,精度丢失问题

LONG类型在后端的长度为20,前端JavaScript的长度为17,所以后端在将LONG类型的数据返回给前端时候,需要转成String类型

方案一:全局配置

yaml配置文件中,进行全局配置

spring:
  jackson:
    generator:
      write-numbers-as-strings: true

方案二:注解
在需要进行转型的字段上面添加注解

 
    @JsonSerialize(using=ToStringSerializer.class)//转化成string传到前端
    private Long userId;
//或者
    
    @JsonFormat(shape = JsonFormat.Shape.STRING)//转化成string传到前端
    private Long userId;

此方案颗粒度小,但是遇到需要转换的字段比较多,偏麻烦

方案三

Jackson提供了这种支持,即对ObjectMapper进行定制,利用Jackson全局转化long类型为String

@Configuration
public class JacksonConfig {
    /**
     * Jackson全局转化long类型为String,解决jackson序列化时传入前端Long类型缺失精度问题
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        Jackson2ObjectMapperBuilderCustomizer cunstomizer = new     Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
                jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance);
                jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
                jacksonObjectMapperBuilder.serializerByType(Long.TYPE, ToStringSerializer.instance);
            }
        };
        return cunstomizer;
    }
}

Long.class对应的是long的包装类Long,
Long.TYPE对应的是基本数据类型long类型
如果你想拦截Long包装类类型的字段,不拦截基本数据类型long字段
除了在这个配置类里拦截外,你还得看你实体类的get方法返回值类型是什么,
因为Jackson转化是用get方法来获取值的,这里的拦截也是看get方法

private Long userId;
 
public long getUserId(){
    return this.userId
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容