1 定义jackson全局序列化配置

@Configuration
public class JacksonConfig {

    // 定义时间格式
    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String TIME_FORMAT = "HH:mm:ss";
    private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    @Bean
    @Primary
    @ConditionalOnMissingBean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 1. 配置时间格式
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
        javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
        javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
        javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
        javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
        objectMapper.registerModule(javaTimeModule);
        // 禁用时间戳
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        // 2. 配置BigDecimal精度处理
        SimpleModule bigDecimalModule = new SimpleModule();
        bigDecimalModule.addSerializer(BigDecimal.class, new DecimalSerializer());
        bigDecimalModule.addDeserializer(BigDecimal.class, new DecimalDeserializer());
        objectMapper.registerModule(bigDecimalModule);

        // 3. 其他通用配置
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);

        return objectMapper;
    }

}

2 定义序列化器和反序列化器

解析序列化和反序列化注解,根据解析的内容进行序列化或者反序列化

public class DecimalDeserializer extends JsonDeserializer<BigDecimal> implements ContextualDeserializer {

    private int scale = 2;
    /**
     * 除数因子
     */
    private int divide = 0;

    /**
     * 乘数因子
     */
    private int multiply = 0;

    public DecimalDeserializer() {
    }

    public DecimalDeserializer(int scale, int divide, int multiply) {
        this.scale = scale;
        this.divide = divide;
        this.multiply = multiply;
    }

	  /**
	  * 获取字段上配置的反序列化
	  */
    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext prov, BeanProperty property) {
        if (property != null && property.getAnnotation(BigDecimalScaleDeserialize.class) != null) {
            BigDecimalScaleDeserialize annotation = property.getAnnotation(BigDecimalScaleDeserialize.class);
            return new DecimalDeserializer(annotation.scale(),
                    Math.abs(annotation.divide()),
                    Math.abs(annotation.multiply())
            );
        }
        return this;
    }

    @Override
    public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String text = jsonParser.getText();
        BigDecimal o = BigDecimal.ZERO;
        if (StringUtils.isNotBlank(text))
            o = new BigDecimal(text);
        if (multiply != 0) {
            o = o.multiply(new BigDecimal(multiply));
        }
        if(divide != 0) {
            o = o.divide(new BigDecimal(divide));
        }
        return o.setScale(scale, RoundingMode.HALF_UP);
    }
}

3 定义注解

反序列化注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalScaleDeserialize {

    /**
     * 精度
     * @return
     */
    int scale() default 2;

    /**
     * 除数 仅为正数
     */
    int divide() default 0;

    /**
     * 乘数因子
     */
    int multiply() default 0;
}

序列化注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface BigDecimalScaleSerialize {

    int scale() default 2;

    /**
     * 除数 仅为正数
     */
    int divide() default 0;

    /**
     * 乘数因子
     */
    int multiply() default 0;
}