You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Jakarta Validation注解校验BigDecimal的精度与刻度?

如何通过Jakarta Validation注解校验BigDecimal的精度与刻度?

嘿,我看你在尝试用Jakarta Validation校验BigDecimal的精度和刻度,代码里的@Decimal注解好像没写完,而且其实Jakarta Validation的标准API里并没有这个注解哦,别担心,我给你捋清楚正确的做法。

你应该是想限制BigDecimal的总精度(比如22位)和小数刻度(比如2位),这个需求用Jakarta Validation标准的@Digits注解就能搞定,它是专门用来校验数字的整数部分和小数部分位数的,正好对应你要的精度和刻度要求。

先给你补全并修正后的完整代码:

import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Getter;
import lombok.Setter;

import java.math.BigDecimal;

@Getter
@Setter
public class DepositRequestDto {

    @NotNull(message = "金额必须提供")
    @Positive(message = "金额必须为正数")
    // 总精度22 = 整数部分20位 + 小数部分2位,对应你需求里的precision=22、scale=2
    @Digits(integer = 20, fraction = 2, message = "金额格式无效,最多支持20位整数、2位小数,总位数不能超过22位")
    private BigDecimal amount;
}

给你解释下这里的关键点:

  • @Digits是Jakarta Validation的标准注解,所有兼容的校验实现(比如Hibernate Validator)都支持它,不用自己瞎折腾自定义注解
  • integer参数:控制BigDecimal整数部分的最大位数,这里20位是因为总精度22减去小数刻度2得到的
  • fraction参数:控制小数部分的最大位数,就是你要的刻度2
  • 如果你需要强制要求小数部分必须是2位(而不是最多2位),那可以自己写个自定义校验注解,但大部分业务场景下@Digits的“最多N位”就足够用了

另外要注意,确保你的项目里已经引入了Jakarta Validation的API和对应的实现依赖,不然注解会不起作用哦。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:25:29