Springboot BigDecimal 精度自定义序列化注解

话不多说, 直接上代码

使用场景

    @ApiModelProperty(value = "共计购买金额")
    @BigDecimalAccuracyFormat
    private BigDecimal totalGoodsAmount;

BigDecimalAccuracyFormat

package com.hz.base.annotation;

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.hz.base.seria.BigDecimalSerializer;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.RoundingMode;

/**
 * description: BigDecimal 对象的序列化器
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)
public @interface BigDecimalAccuracyFormat {

    /**
     * 保留小数点模式, 默认 非四舍五入
     */
    RoundingMode mode() default RoundingMode.HALF_DOWN;

    /**
     * 格式化
     */
    String decimalFormat() default "0.00";
}

BigDecimalSerializer

package com.hz.base.seria;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.hz.base.annotation.BigDecimalAccuracyFormat;

import java.io.IOException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Objects;

/**
 *@author shen chen
 *@Date 2023-11-30
 *@Description
 */
public class BigDecimalSerializer extends StdSerializer<BigDecimal> {
    public BigDecimalSerializer() {
        super(BigDecimal.class);
    }
    public BigDecimalSerializer(Class<BigDecimal> t) {
        super(t);
    }

    @Override
    public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        Object parent = gen.getCurrentValue();
        if (parent != null) {
            Field[] fields = parent.getClass().getDeclaredFields();
            for (Field field : fields) {
                if (field.isAnnotationPresent(BigDecimalAccuracyFormat.class)) {
                    BigDecimalAccuracyFormat annotation = field.getAnnotation(BigDecimalAccuracyFormat.class);
                    // 这里获取到注解的属性
                    RoundingMode mode = annotation.mode();
                    String decimalFormat = annotation.decimalFormat();
                    // 根据获取到的模式和格式化进行序列化处理
                    gen.writeString(formatBigDecimal(getDecimalFormatInstance(decimalFormat, mode), value));
                    return;
                }
            }
        }

        gen.writeString(value.toString());
    }

    /**
     * 获取数值格式化实例
     *
     * @return {@link DecimalFormat}
     */
    public DecimalFormat getDecimalFormatInstance(String format, RoundingMode mode) {
        DecimalFormat decimalFormat = new DecimalFormat(format);
        // 四舍五入模式
        decimalFormat.setRoundingMode(mode);
        return decimalFormat;
    }

    /**
     * BigDecimal格式化,保留两位小数
     *
     * @param bigDecimal
     *            数值
     * @param decimalFormat
     *            格式化
     * @return 数值格式化字符串
     */
    public String formatBigDecimal(DecimalFormat decimalFormat, BigDecimal bigDecimal) {
        if (Objects.isNull(bigDecimal)) {
            return decimalFormat.format(BigDecimal.ZERO);
        }
        return decimalFormat.format(bigDecimal);
    }

    private static final long serialVersionUID = 5217596790080823620L;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值