问题
前端js数字太大,长度超过了17大约是20位,这个时候,后端返回的Long
类型,在前端就会出现完美异常
例如,后端返回值为:
{"id":695065242312409088}
前端接收的时候,id一般只会做更新使用,不会渲染出来,所以导致抓取这个id进行更新的时候导致后端异常,说找不到这个id,前端打印id值后为
{"id":695065242312409100}
原因
原因是数值过大,超过了前端最大数值
> 695065242312409088 > Number.MAX_SAFE_INTEGER
< true
解决
网上大多的解决办法是,前端转换操作,可是我的值都已经返回到前端的时候就已经是错误的了,我还能怎么操作呢,猴戏一番之后果断放弃。
方案:后端转换成字符类型
但是,又有了一个问题,后端是Long
类型,又是屎山代码,谁敢更改类型,研究发现可以在序列化
的时候做一番骚操作
使用阿里的fastjson
, 这里的fastjson
在Maven
中版本是:
<fastjson.version>1.2.53</fastjson.version>
然后在实体对象的id
属性上加上注解 @JSONField
@JSONField(serializeUsing = LongToStringSerializer.class)
private Long id = null;
这个时候如果你不往下看,你会开始对我口吐芬芳了,说找不到LongToStringSerializer
类,那么如下:
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.ObjectSerializer;
import com.alibaba.fastjson.serializer.SerializeWriter;
import java.io.IOException;
import java.lang.reflect.Type;
public class LongToStringSerializer implements ObjectSerializer {
public static final LongToStringSerializer instance = new LongToStringSerializer();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
throws IOException {
SerializeWriter out = serializer.out;
if (object == null) {
out.writeNull();
return;
}
String strVal = object.toString();
out.writeString(strVal);
}
}
然后,还没结束,哈哈哈哈哈哈哈,你会发现,苟曰的springboot用的默认的json
序列化解析是 jackson
, 还需要把这货解决掉
把这货解决掉分两步
第一步,启动类实现implements WebMvcConfigurer
@SpringBootApplication
public class TmsAppApplication implements WebMvcConfigurer {
...
}
第二步,把下面的代码搭配其中,当然是搭配到启动类中
/**
* 在这里我们使用 @Bean注入 fastJsonHttpMessageConvert
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
// 1、需要先定义一个 convert 转换消息的对象;
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//3、在convert中添加配置信息.
fastConverter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(fastConverter);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
/*
* 1、需要先定义一个 convert 转换消息的对象;
* 2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
* 3、在convert中添加配置信息.
* 4、将convert添加到converters当中.
*
*/
// 1、需要先定义一个 convert 转换消息的对象;
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、添加fastJson 的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat
);
//3、在convert中添加配置信息.
fastConverter.setFastJsonConfig(fastJsonConfig);
//4、将convert添加到converters当中.
converters.add(fastConverter);
}