问题来源

在项目中,当实体类的字段为Long类型时 如果Long值超过前端能处理显示的长度范围时,会导致前端处理数值的精度丢失。

所以我们需要将Long值返回给前端时转为String,另外又不想变更字段的类型,或者添加新的字段的话。这个时候我们可以用注解@JsonSerialize,将注解标注在对应字段上,在Json序列化的时候把Long自动转为String。注解的定义如下:

package com.fasterxml.jackson.databind.annotation;


@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.TYPE, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonSerialize {
...
}

@JsonSerialize是Spring Boot默认提供的解析Json的Jackson工具包下的注解。在使用时将该注解定义在字段上即可。Jackson提供了许多Json序列化器。另外我们也可以自定义序列化器。
在这里插入图片描述
我在项目中都是将注解标注在对应字段上,在Json序列化的时候把Long自动转为String。

    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

问题分析

在网上找到的解决方案大多说的是:被转换的字段必须是包装类类型,否则会转换失败。

@JsonSerialize(using = ToStringSerializer.class)
private Long parentId;    //转化成功
@JsonSerialize(using = ToStringSerializer.class)
private long parentId;    //转化失败

但我这次遇到的不是这个错误,我是在开发过程中突然发现后台传到前端的Long类型数据,前端收到的是整数型的精度丢失的数据。

原因

@JsonSerialize注解是在SpringBoot默认提供的JSON解析包Jackson中的。但是因为我新引入的oss包中包含了谷歌提供的解析JSON数据的GSON工具包,造成了注解@JsonSerialize失效。

解决

在pom.xml中指定排除oss包中的GSON包即可。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐