java自定义异常在通用校验工具类中规范起作用的核心是解耦条件判断与异常构造:通过泛型+supplier封装校验方法,统一继承basevalidationexception基类并分层派生子类,支持链式校验与批量错误收集,并与jsr-303注解协同互补。

Java 中让自定义异常在通用校验工具类里规范起作用,核心是把“条件判断”和“异常构造”解耦,避免重复写 if-throw,同时保持语义清晰、类型安全、易于扩展。
封装带 Supplier 的静态校验方法
用泛型 + Supplier 封装校验逻辑,能精准控制抛出的异常类型,且调用时可自由构造带错误码、上下文信息的异常实例:
- 定义方法签名:接收布尔表达式、提示消息、异常构造器(Supplier
) - 内部只做一次判断,不满足就立即 throw exceptionSupplier.get()
- 调用方负责传入具体异常类型,比如 BusinessException::new 或 () → new BusinessException("E002", "订单ID非法")
统一异常基类与业务异常分层
校验工具类要真正“规范”,离不开异常体系设计:
- 定义一个运行时基类 BaseValidationException,含错误码、业务模块标识、原始参数快照等字段
- 按场景派生子类:如 ParamEmptyException、RangeInvalidException、FormatMismatchException
- 工具类中所有校验方法默认抛该基类或其子类,便于全局统一捕获和日志脱敏
支持链式校验与批量错误收集
单个参数校验用 if-throw 足够,但面对 DTO 多字段校验,需升级能力:
- 提供 validateAll() 方法,接收多个校验项(谓词 + 异常 Supplier),全部执行后汇总所有异常
- 返回 List
或封装后的 ValidationResult 对象,含是否通过、错误列表、首个异常等 - 适合接口入参整体校验场景,避免校验失败就中断,提升调试友好性
与 JSR-303 注解协同而非替代
通用工具类不是要取代 @Valid,而是补足其短板:
- JSR-303 适合字段级静态规则(非空、长度、正则),但难以表达跨字段逻辑(如“开始时间不能晚于结束时间”)
- 工具类专注动态、组合、上下文敏感的校验,例如:Asserts.isTrue(order.getAmount().compareTo(minAmount) >= 0, "金额不足", () → new InsufficientBalanceException(order.getId()))
- Controller 层可先走 @Valid 做基础过滤,再用工具类做业务规则兜底
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











