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

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

方案一:全局配置

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

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

缺点:颗粒度太大,会把所有的数字类型全转为String(如:Integer),对有些运用场景不适合,如分页

方案二:注解

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


	@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
}

如果你只定义了拦截Long.class,那么这样你的这个字段就没有被拦截还是数字到前端
因为你拦截的是Long类型,而get方法返回的是long类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值