话不多说, 直接上代码
使用场景
@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;
}
3740

被折叠的 条评论
为什么被折叠?



