Long类型传到前端失去精度(2):Long类型不是实体类的某一个字段,Long类型是一个函数的返回值
又是转换Mybatis-Plus的一天,又遇到了之前熟悉的问题:Long类型传到前端失去精度。可是又出现了新的问题,之前是Long类型作为一个实体类的字段,我们使用注解或者重写一个配置类就可以解决。
Springboot-Vue-MybatisPlus 返回给前端的 Long类型数据失去精度怎么办 之 Long类型作为实体类的一个属性
那么作为函数的返回值该怎么办呢?
首先我们要理解之前的写注解和配置类的目的是什么?目的是在实体类进行序列化的时候,在转为json字符串的时候,将Long类型转为String类型再进行保存,那么我们可不可以手动复刻一下,自己转成String类型。
一、我们首先试一下自己转成String类型
@RequestMapping("/getFactoryIDByFactoryManagerUser")
public String getFactoryIDByFactoryManagerUserReturnString(
@RequestParam("factoryManagerUserName") String factoryManagerUserName) {
QueryWrapper<FactoryManager> wrapper = new QueryWrapper<>();
wrapper
.eq("fm_name", factoryManagerUserName);
String factoryID=factoryManagerMapper.selectOne(wrapper).getFm_factoryID().toString();
return factoryID;
}
结果是:
1430539259873329200
我猜测可能是这次的字符串被前端自动解析为Long类型了,导致精度再次失真。
二、我们采用alibaba的fastJson产生字符串的方式
@RequestMapping("/getFactoryIDByFactoryManagerUser")
public String getFactoryIDByFactoryManagerUserReturnString(
@RequestParam("factoryManagerUserName") String factoryManagerUserName) {
QueryWrapper<FactoryManager> wrapper = new QueryWrapper<>();
wrapper
.eq("fm_name", factoryManagerUserName);
String factoryID=JSON.toJSONString(factoryManagerMapper.selectOne(wrapper).getFm_factoryID());
return factoryID;
}
结果是:
1430539259873329200
这里失真的原因是生成的Json字符串,并不是将Long类型变为String类型,只是生成了一个Json类型的字符串,所以前端解析的时候还是Long类型,所以失真还是必然的。
之前的尝试可以说是葫芦娃救爷爷,一个一个上。手握转String和fastJson这两张大小王,当然要一起出!!!这次我们先转化为String类型,然后再生成字符串。
为什么要生成Json呢?我觉得是这个原因:
json的好处:
- 省空间,基本没什么浪费的字符
- 标准,主流的都用它,也都支持它
- 语言无关,任何语言都能轻松搞定
- 类型安全,值是有类型的,比如整数、字符串、布尔等
主要是第四点《类型安全》,Json可以告诉前端,我这个是字符串,你不要自己转化为Long!
@RequestMapping("/getFactoryIDByFactoryManagerUser")
public String getFactoryIDByFactoryManagerUserReturnString(
@RequestParam("factoryManagerUserName") String factoryManagerUserName) {
QueryWrapper<FactoryManager> wrapper = new QueryWrapper<>();
wrapper
.eq("fm_name", factoryManagerUserName);
return JSON.toJSONString(factoryManagerMapper.selectOne(wrapper).getFm_factoryID().toString());
}
结果是:
1430539259873329153