自定義全域性序列化將BigDecimal型別序列化為String型別,以及註解實現BigDecimal型別序列化為String型別
阿新 • • 發佈:2021-01-06
解決方式一:自定義全域性序列化
在專案上線以後商品購買出現故障,原因是價格不對 30.495,但是資料庫是30.50。
- 定義問題為BigDecimal失去精度
- 將BigDecimal型別的資料序列化成String型別傳給前端解決問題。前端取值let 或者var 不是強型別。
一、自定義序列化類繼承StdSerializer類重新serialize方法
public class BigDecimalStringSerializer extends StdSerializer<BigDecimal> {
public final static BigDecimalStringSerializer instance = new BigDecimalStringSerializer();
public BigDecimalStringSerializer() {
super(BigDecimal.class);
}
@Override
public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) throws IOException {
if(value==null){
gen.writeString("0" );
}else{
String val=value.stripTrailingZeros().toPlainString();
gen.writeString(val);
}
}
}
二、配置全域性序列化
/**
* Jackson配置類
*/
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper( Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
SimpleModule bigDecimalModule = new SimpleModule();
//序列化將BigDecimal轉String型別
bigDecimalModule.addSerializer(BigDecimal.class, BigDecimalStringSerializer.instance);
bigDecimalModule.addKeySerializer(BigDecimal.class, BigDecimalStringSerializer.instance);
// 註冊轉換器
objectMapper.registerModule(bigDecimalModule);
// json不返回null的欄位
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return objectMapper;
}
}
三、測試
建立實體類用於測試
@Data
public class UserDetail {
private BigDecimal price;
private String phone;
}
@GetMapping("/user/detail")
public UserDetail userdetail(){
return new UserDetail(BigDecimal.valueOf(2L),"12345");
}
- 這樣配置以後就是String型別了
解決方式二:加上註解@JsonSerialize(using= ToStringSerializer.class)
直接在BBigDecimal型別的欄位加上註解@JsonSerialize(using= ToStringSerializer.class)
@JsonSerialize(using= ToStringSerializer.class)
private BigDecimal price;
- 作用效果一樣,但是缺點是每個BigDecimal型別屬性都需要加這個註解。