Springboot-Vue-MybatisPlus 返回给前端的 Long类型数据失去精度怎么办?
在将自己的Mybatis的系统转换为Mybatis-Plus的时候,遇到了许多问题。
今天的问题是,Java实体类中的字段属性是Long类型、数据库MySql中的是bigint,在前端显示的时候Long的进度却丢失了,所有的ID显示的都一样,这该怎么解决呢?
实体类:
package com.neu.edu.cloudfactoryplus.bean;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("factory_manager")
public class FactoryManager implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "fm_id", type = IdType.ID_WORKER)
private Long fm_id;
private String fm_name;
private String fm_password;
private String fm_realName;
private String fm_contact;
@JsonSerialize(using = ToStringSerializer.class)
private Long fm_factoryID;
@Version
private Integer version;
@TableLogic
private Integer deleted;
@TableField(fill = FieldFill.INSERT)
private Date gmt_create;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmt_modified;
}
数据库设计
错误结果:
如图所示,Long类型精度已经丢失!!!
解决办法:
1)如果你采用的是 Spring 中的 Jackson 进行 Json 格式封装,那么要这么做
用到了JsonFormat注解让对象属性在经过spring解析成JSON时直接转化成字符串,在要转的字段上加上一下字段:
@TableId(value = "user_id", type = IdType.INPUT)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long userId;
或者写一个配置类进行全局拦截,将所有的 Long 类型(注意这里是 Long 包装类,不是 long 类型!!!)转换为 String 类型:
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
Jackson2ObjectMapperBuilderCustomizer cunstomizer = new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance);
}
};
return cunstomizer;
}
}
2)如果你和我一样采用的是 alibaba 的 fastjson 进行 Json 格式封装,那么要这么做
在Long类型的字段上面加上注解,在转换为json的时候,讲此字段转为String类型(特别注意:加上注解导入类的时候,一定要仔细看清,导入alibaba的类,因为IDEA默认好像导入jackson的类,要不然会报错的!!!)
@JSONField(serializeUsing = ToStringSerializer.class)
private Long fm_factoryID;
注意这些导入的类的名字!!!!
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
解决后的结果
看到这里了,不点个赞再走(o _ o)