自定义注解格式化处理BigDecimal

本文介绍了如何在Java开发中,通过自定义BigDecimalSerializer类和Lombok的@JsonSerialize注解,实现在Entity中的BigDecimal属性保持两位小数的精度控制,并给出了完整的测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、场景描述

二、实现步骤

1、自定义类

2、使用注解

3、测试


一、场景描述

        在开发过程中,如果有实体类的属性中存在BigDecimal的属性,并且需要对其进行校验,例如:限制BigDecimal的小数点位数是两位。但目前没有注解可以完成这个操作,因此我们可以使用下面的工具类和注解进行处理。

二、实现步骤

1、自定义类

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;


public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {

    @Override
    public void serialize(BigDecimal value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        if (value != null) {
            // 保留2位小数,四舍五入
            BigDecimal number = value.setScale(2, RoundingMode.HALF_UP);
            jsonGenerator.writeNumber(number);
        } else {
            jsonGenerator.writeNumber(value);
        }
    }
}

2、使用注解


import com.example.yht.utils.BigDecimalSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;
import lombok.ToString;

import java.math.BigDecimal;
@Data
@ToString
public class Student {
    private String name;

    private Integer age;

    private String address;

    @JsonSerialize(using = BigDecimalSerializer.class)
    private BigDecimal score;
}

3、测试

@RestController
public class TestController {
    @PostMapping("/test")
    public Student test(@RequestBody Student student){
        return student;
    }
}

测试结果:

### Java 中使用注解方式实现 BigDecimal 保留两位小数 在 Java 开发中,为了简化代码逻辑并增强可读性和维护性,可以利用自定义注解处理 `BigDecimal` 的格式化操作。通过创建特定的处理器类,在运行时解析这些注解从而自动完成数据转换。 #### 自定义注解 @DecimalFormat 首先定义一个名为 `@DecimalFormat` 的注解用于标记需要进行格式化的字段: ```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 DecimalFormat { int scale() default 2; // 默认保留两位小数 } ``` 此部分描述了如何设置注解属性,默认情况下会将数值调整为保留两位有效数字[^2]。 #### 注解处理器 接着编写一个工具类负责遍历实体类中的所有字段,并应用相应的格式化规则: ```java import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; public class DecimalFormatter { public static void format(Object obj) throws IllegalAccessException { Class<?> clazz = obj.getClass(); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { if (field.isAnnotationPresent(DecimalFormat.class)) { field.setAccessible(true); Object value = field.get(obj); if (value instanceof BigDecimal) { DecimalFormat annotation = field.getAnnotation(DecimalFormat.class); ((BigDecimal)value).setScale(annotation.scale(), RoundingMode.HALF_UP); field.set(obj, ((BigDecimal)value)); } } } } } ``` 上述代码展示了如何反射访问被标注的对象成员变量,并依据指定参数执行四舍五入运算[^1]。 #### 实际应用场景示例 假设有一个表示商品价格信息的数据模型如下所示: ```java class ProductPrice { private String productName; @DecimalFormat(scale=2) private BigDecimal price; // getters and setters... } ``` 当实例化此类并将其实例传递给 `DecimalFormatter.format()` 方法之后,内部存储的价格值将会按照预设条件得到适当处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值