核心是用可配置、可复用的规则集合(如minamountrule、maxamountrule等)配合invalidamountexception拦截金额,规则统一实现amountrule接口,支持组合、动态加载与场景化装配,校验失败时抛出带语义的异常,便于精准捕获与业务响应。

用集合规则配合自定义异常类拦截金额,核心是把“哪些金额不合法”提前定义成可配置、可复用的规则集合,再通过抛出自定义异常实现语义清晰、易于捕获和处理的拦截逻辑。关键不在硬编码判断,而在规则可读、可组合、可扩展。
定义明确的金额校验规则集合
把常见金额限制抽象为独立规则类,每个类只负责一种判断逻辑,比如最小值、最大值、必须为整数、禁止为零、必须是特定倍数等。这些规则统一实现一个接口(如 AmountRule),具备 validate(BigDecimal amount) 方法。
- MinAmountRule:检查是否 ≥ 指定下限
- MaxAmountRule:检查是否 ≤ 指定上限
- MultipleOfRule:检查是否为某数值的整数倍(如手续费必须是0.01元整数倍)
- NonZeroRule:排除 0 或 -0.00
用自定义异常承载业务语义和上下文
不直接 throw new RuntimeException("金额不合法"),而是定义 InvalidAmountException,并携带字段:ruleName(触发哪条规则)、actualValue(实际金额)、expected(期望条件)。这样下游能精准区分“超上限”还是“非整数倍”,便于日志归因或前端提示。
示例:
throw new InvalidAmountException("MaxAmountRule", new BigDecimal("50000.01"), "≤ 50000.00");
组合规则并统一执行拦截
将多个规则放入 List
- 规则集合可序列化,便于审计或灰度开关
- 拦截入口方法保持简洁:传入金额 + 规则集 → 成功返回 or 抛出 InvalidAmountException
- 避免在规则内做 I/O 或耗时操作,保证校验轻量
在业务层优雅捕获与响应
调用方用 try-catch 捕获 InvalidAmountException,根据 ruleName 做差异化处理:记录告警、返回特定错误码、转换为用户友好的提示文案(如“单笔最高5万元”)。不建议在 catch 块里重新抛 runtime 异常,会丢失原始语义。
若使用 Spring,还可配合 @ControllerAdvice 全局统一封装该异常为标准响应体,前端无需识别多种错误类型。











