问题描述:
VO类有关数据的属性都是Bigdecimal,如果返回给前端的数位超过六位,会被自动转成科学计数法,为了避免这种情况的发生,返给前端的数据最好是String,Bigdecimal有toPlainString方法,能将数值正确转成字符串,但当调用toPlainString的数为null时会报空指针异常,方法、属性过多,不能每一个都做判断。
解决方案:
增加一个Json全局配置,反序列化时,将所有的Bigdecimal用toPlainString方法变成String。
配置文件
@JsonComponent
public class JsonConfig {
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
/**
* 可配置项:
* 1.Include.Include.ALWAYS : 默认
* 2.Include.NON_DEFAULT : 默认值不序列化
* 3.Include.NON_EMPTY : 属性为 空("") 或者为 NULL 都不序列化
* 4.Include.NON_NULL : 属性为NULL 不序列化
**/
// objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
/**
* 序列化时,将所有的long变成string
*/
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
module.addSerializer(BigDecimal.class, ToStringSerializer.instance);
module.addSerializer(BigDecimal.class, BigDecimalToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}
}
自定义一个BigDecimalToStringSerializer类
public class BigDecimalToStringSerializer extends StdSerializer<BigDecimal> {
public static final BigDecimalToStringSerializer instance = new BigDecimalToStringSerializer();
public BigDecimalToStringSerializer() { super(BigDecimal.class); }
@Override
public boolean isEmpty(SerializerProvider prov, BigDecimal value) {
return value == null;
}
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeString(value.toPlainString());
}
@Override
public void serializeWithType(BigDecimal value, JsonGenerator g, SerializerProvider provider,
TypeSerializer typeSer)
throws IOException
{
serialize(value, g, provider);
}
public JsonNode getSchema(SerializerProvider provider, Type typeHint) throws JsonMappingException {
return createSchemaNode("string", true);
}
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException
{
//json类型是String
visitStringFormat(visitor, typeHint);
}