1. 程式人生 > 其它 >自定義全域性序列化將BigDecimal型別序列化為String型別,以及註解實現BigDecimal型別序列化為String型別

自定義全域性序列化將BigDecimal型別序列化為String型別,以及註解實現BigDecimal型別序列化為String型別

技術標籤:學習javajava

解決方式一:自定義全域性序列化

在專案上線以後商品購買出現故障,原因是價格不對 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型別屬性都需要加這個註解。