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类型