springBoot long类型 长id 到前端丢失精度问题
在Spring Boot中,如果将Long类型的id传递到前端,可能会遇到精度丢失的问题。这是因为JavaScript无法精确地表示大于Number.MAX_SAFE_INTEGER(即9007199254740991)的整数。
为了解决这个问题,你可以采用以下方法之一:
方式1 : 通过注解方式
@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class SysRoles implements Serializable { // 注解处理 @JsonSerialize(using=ToStringSerializer.class) private Long id; }
方式2: 全局设置 ,改写配置放在容器中。
@Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, ToStringSerializer.instance); module.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(module); return objectMapper; }
实际应用场景:上述第二个方案会对所有Long类型进行转换 实际上并不需要 一下方案对值超过一定范围的属性进行转换
public class IdLongSerializer extends JsonSerializer<Long> { @Override public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value > 900000000000000L) { gen.writeString(value.toString()); } else { gen.writeNumber(value); } } }
@Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, new IdLongSerializer()); module.addSerializer(Long.TYPE, new IdLongSerializer()); objectMapper.registerModule(module); return objectMapper; }
⎛⎝官萧何⎠⎞一只快乐的爪哇程序猿;邮箱:1570608034@qq.com

浙公网安备 33010602011771号