前言
在返回Long类型数据给前端时,出现后三位数字精度丢失问题。例如Long类型的Id,导致前端回传Id到后端时,后三位数字都丢失为0,导致查询不到对应Id的数据
解决办法
解决办法,分为
-
局部处理,在实体类的Long类型字段上,添加注解,适合实体类中个别字段,需要转换的场景
-
全局处理,配置一个Jackson的消息转换器,让我们在Controller层,返回实体对象时,在SpringMVC将实体类转换为Json字符串之前,将所有Long类型的字段数据,都转为String字符串类型。适合所有实体类的Long类型都转换的场景
局部处理
- 定义一个Long类型转String类型的序列化器,泛型为源类型,例如这里是Long
/**
* 自定义,Long转换String的序列化器类
* 泛型:源类型
*/
public class Long2StringSerializer extends JsonSerializer<Long> {
@Override
public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
//将值转换为String,并写出
jsonGenerator.writeString(value.toString());
}
}
- 在要返回的实体类上,添加
@JsonSerialize
注解
public class ApArticle implements Serializable {
//将Long转换为String,解决前端接收高精度数字,会丢失精度的问题(注意:这个注解是局部转换)
@JsonSerialize(using = Long2StringSerializer.class)
private Long id;
}
全局处理
- 定义一个对象映射器,继承于ObjectMapper,添加序列化器和反序列化器,将Long类型,转为String类型
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
*/
public class JacksonObjectMapper extends ObjectMapper {
public JacksonObjectMapper() {
super();
//注册序列化器,将Long类型,转为String类型
SimpleModule simpleModule = new SimpleModule()
.addSerializer(Long.class, ToStringSerializer.instance);
//注册功能模块 例如,可以添加自定义序列化器和反序列化器
this.registerModule(simpleModule);
}
}
- 新增或修改SpringMVC配置类,添加上面的对象映射器
/**
* SpringMVC配置
*/
@Configuration
public class ServiceMvcConfig implements WebMvcConfigurer {
/**
* 扩展mvc框架的消息转换器
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//创建消息转换器对象
MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
//设置对象转换器,底层使用Jackson将Java对象转为json
messageConverter.setObjectMapper(new JacksonObjectMapper());
//将上面的消息转换器对象追加到mvc框架的转换器集合中
converters.add(0, messageConverter);
}
}
网友评论