springboot自定义注解,格式化BigDecimal返回的值

项目里有几个字段 是BigDecimal 类型,前台表单校验,限制最多有两位小数,数据库是最多6位小数,所以查询出的数据可能是整数,可能有1位小数,可能有2位。

需要统一返回都是2位小数

代码


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Objects;

@JsonComponent
public class BigDecimalSerializer extends JsonSerializer<BigDecimal> implements ContextualSerializer {
    private String format = "#####0.00";

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

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {
        if(beanProperty !=null ){
            if(Objects.equals(beanProperty.getType().getRawClass(),BigDecimal.class)){
                BigDecimalFormat bigDecimalFormat = beanProperty.getAnnotation((BigDecimalFormat.class));
                if(bigDecimalFormat == null){
                    bigDecimalFormat = beanProperty.getContextAnnotation(BigDecimalFormat.class);
                }
                BigDecimalSerializer bigDecimalSerializer = new BigDecimalSerializer();
                if(bigDecimalFormat != null){
                    bigDecimalSerializer.format = bigDecimalFormat.value();
                }
                return bigDecimalSerializer;
            }
            return serializerProvider.findValueSerializer(beanProperty.getType(),beanProperty);
        }
        return serializerProvider.findNullValueSerializer(beanProperty);
    }
}


import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
import java.math.BigDecimal;

@JsonComponent
public class BigDecimalDeSerializer extends JsonDeserializer<BigDecimal> {
    @Override
    public BigDecimal deserialize(JsonParser jsonParser, 
                                  DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        return new BigDecimal(jsonParser.getText().replaceAll(",",""));
    }
}



import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonSerialize(using = BigDecimalSerializer.class)
@JsonDeserialize(using = BigDecimalDeSerializer.class)
public @interface BigDecimalFormat {
    String value() default "#####0.00";
}

使用,在需要的字段上

@BigDecimalFormat
private BigDecimal price;

其实还有另外的方法,但是是全局生效,

参考链接

https://www.jianshu.com/p/db07543ffe0a

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想自定义一个注解,使其可以将 `BigDecimal` 对象保留指定的小数位数,您可以按照以下步骤进行操作: 首先,定义一个 `@TwoDecimalPlaces` 注解: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TwoDecimalPlaces { int value() default 2; } ``` 在注解中,我们定义了一个 `value` 属性,用于指定要保留的小数位数,默认为 2。 然后,在您的代码中,您可以使用 `@Inject` 注入 `ConfigProvider` 对象,并在需要使用 `BigDecimal` 时将其保留到指定的小数位数: ```java import javax.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; public class MyService { @Inject ConfigProvider configProvider; public void doSomething() { BigDecimal value = new BigDecimal("123.456"); TwoDecimalPlaces annotation = getClass().getDeclaredField("value").getAnnotation(TwoDecimalPlaces.class); int scale = annotation != null ? annotation.value() : configProvider.getConfig().getValue("myapp.decimal.scale", Integer.class); value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // ... } } ``` 在此示例中,我们首先使用 `getClass().getDeclaredField("value").getAnnotation(TwoDecimalPlaces.class)` 方法获取 `@TwoDecimalPlaces` 注解,如果未找到该注解,则使用 `ConfigProvider` 获取 `myapp.decimal.scale` 配置作为保留的小数位数。 这样,您就可以在代码中使用 `@TwoDecimalPlaces` 注解来指定要保留的小数位数了: ```java public class ExampleClass { @TwoDecimalPlaces(value = 3) private BigDecimal value; // ... } ``` 在此示例中,我们将 `value` 字段上的 `@TwoDecimalPlaces` 注解设置为保留 3 位小数,因此在使用 `doSomething` 方法时,`value` 将被设置为保留 3 位小数的 `BigDecimal` 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值