• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

SpringBoot通过自定义注解对BigDecimal输出的小数位数进行格式化

武飞扬头像
野指针12138
帮助4


前言

在近期的开发任务中出现如下场景:
1.Java代码中BigDecimal类型的数据设置初始值为0,且数据库中该字段的类型也为BigDecimal,但查询返回给前端时值为0,没有小数位数(业务需要0也要有小数位数)。
2.根据业务场景同为BigDecimal类型的不同字段返回给前端时需要保留不同的小数位数。
因为以上两点所以无法设置全局的BigDecimal格式化类型,通过查询资料发现可以通过自定义注解的方式搭配自定义序列化器实现需求。


一、JsonSerializer

JsonSerializer类:提供将对象或值类型序列化为 JSON 以及将 JSON 反序列化为对象或值类型的功能。
继承JsonSerializer类需要实现serialize()方法,在这个方法中处理要返回的数据。

二、ContextualSerializer

ContextualSerializer:JsonSerializer可以实现的附加接口以获取回调,该回调可用于创建序列化程序的上下文实例以用于处理支持类型的属性。
这对于可以通过注释配置的序列化程序很有用,或者应该根据正在序列化的属性类型而具有不同的行为。

三、实现

代码如下:

1.继承JsonSerializer类,实现ContextualSerializer接口

@JsonComponent
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> implements ContextualSerializer {
    //格式化BigDecimal类型的小数位数(默认)
    private String format = "#####0.00";


    @Override
    public void serialize(BigDecimal bigDecimal, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(new DecimalFormat(format).format(bigDecimal));
    }

    /**
     * createContextual可以获得字段的类型以及注解。
     * createContextual方法只会在第一次序列化字段时调用(因为字段的上下文信息在运行期不会改变),所以不用担心影响性能。
     *
     * @param serializerProvider
     * @param beanProperty
     * @return
     * @throws JsonMappingException
     */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        //当前字段不为空
        if (beanProperty != null) {
            //如果当前字段类型为BigDecimal类型则处理,否则跳过
            if (Objects.equals(beanProperty.getType().getRawClass(), BigDecimal.class)) {
                //获取当前字段的自定义注解
                OMSBigDecimalFormat annotation = beanProperty.getAnnotation(OMSBigDecimalFormat.class);
                //没有打自定义注解,获取上下文中的自定义注解
                if (annotation == null) {
                    annotation = beanProperty.getContextAnnotation(OMSBigDecimalFormat.class);
                }
                BigDecimalSerializer bigDecimalSerializer = new BigDecimalSerializer();
                String tmp = "#####0.";
                //打了自定义注解的字段
                if (annotation != null) {
                    //获取想保留的小数位数
                  for (int i=0;i< annotation.value();i  ){
                      tmp = tmp   "0";
                  }
                    bigDecimalSerializer.format = tmp;
                }
                return bigDecimalSerializer;
            }
            return serializerProvider.findContentValueSerializer(beanProperty.getType(), beanProperty);
        }
        return serializerProvider.findNullValueSerializer(beanProperty);
    }
}
学新通

2.自定义注解

代码如下:

/**
 * OMS BigDecimal类自定义注解
 */
@Retention(RetentionPolicy.RUNTIME)//运行时注解
@Target(ElementType.FIELD)//作用于字段
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)//指定序列化器
public @interface OMSBigDecimalFormat {
    int value() default 2;//bigDecimal保留的小数位数
}

3.参考

链接: JsonSerializer

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhahbg
系列文章
更多 icon
同类精品
更多 icon
继续加载