介绍
rest接口,解决返回的long类型数字精度丢失问题
问题描述
后端long类型的数据返回前端时,经过js处理后,会存在精度丢失的情况。之所以会这样,是因为long类型的数字超过了js的数字处理范围。
问题重现
- 方法一:打开浏览器,按F12调出控制台,在控制台中输入 console.log(9223372036854775807) ,打印的结果与传入的参数不一致
- 方法二:启动服务,打开浏览器访问 http://localhost:8080/,点击1和2两个超链接,它们请求的接口一样,但是返回的结果中,a字段值不一致
解决方案
- 方法一,在属性上添加注解:@JsonSerialize(using = ToStringSerializer.class),将数值转换为字符串
@Data
@Accessors(chain = true)
public class DemoRespDTO implements Serializable {
private static final long serialVersionUID = 1019466745376831818L;
private Long a;
@JsonSerialize(using = ToStringSerializer.class)
private Long b;
private String c;
private Long t;
}
- 方法二,在application.properties配置文件中添加配置:
spring.jackson.generator.write-numbers-as-strings=true
注意:此方式,会影响所有的接口,所有接口中的数字字段,都会被转换为字符串输出
- 方法三,spring boot项目中添加jackson配置:
@Configuration
public class BigNumberHandlerConfig {
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
//数字转字符串
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(Float.class, ToStringSerializer.instance);
simpleModule.addSerializer(Float.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(Double.class, ToStringSerializer.instance);
simpleModule.addSerializer(Double.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
mapper.registerModule(simpleModule);
converter.setObjectMapper(mapper);
return converter;
}
}
- 码云 https://gitee.com/hweiyu/spring-boot-lose.git