解决Java Spring项目大整型被科学计数法的问题

原创     发表于 2020-11-15 21:32     阅读 90  
讲解如何优雅的处理Long、BigInter等大整型避免科学计数法。

项目中经常会使用到Long、BigInteger等大整型的数据类型,当数据长度过大时,返回到前端的数据会被科学计数法,相信很多开发人员都遇到过类似得问题,那怎么解决呢?

1、将数据长度过大的数据类型在返回时,手动改为String类型以字符串的形式输出,这样全部被当成字符串输出自然不会被科学计数法,问题得到解决。但是这样的解决方式比较低级,给编码也带来了很大的麻烦,业务代码中会遇到类型转换处理,明显这样的做法不优雅,比较笨!

2、根据String 框架数据返回逻辑,通过Json切面数据处理的方式重写数据映射,下面主要以 Jackson 形式讲解,其实问题跟第一种方案类似,都是处理为字符串输出,不过这种方式更容易被接入,完全没有代码侵入。

@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化,属性为NULL 不序列化
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

SimpleModule module = new SimpleModule();
module.addSerializer(BigInteger.class, new NumberSerializerProvider());
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
objectMapper.registerModule(module);
return objectMapper; }

NumberSerializerProvider 实现代码:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
* @Author: HuangLongPu
* @Date: 2020/11/3 16:27
*/
public class NumberSerializerProvider extends JsonSerializer<Number> {

@Override
public void serialize(Number value, JsonGenerator generator, SerializerProvider serializer) throws IOException {
if(value == null) {
generator.writeNull();
} else {
generator.writeString(value.toString());
}
}
}

这样的方式,是不是更优雅?

 Fastjson 处理得方式稍有不同,主要通过 FastJsonConfig 对象进行注入:

FastJsonConfig fastJsonConfig = new FastJsonConfig();

serializeConfig.put(BigDecimal.class, new HttpMessageBigIntConvertSerializer());

Fastjson 形式具体实现请参考 请移步到obatis-web 的项目实现