问题来源
在项目中,当实体类的字段为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包即可。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/44293.html