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

从数据库查询结果执行null校验的重复代码是否有必要统一抽取?

结论

非常有必要对这类重复的空校验逻辑做统一抽取

抽取的核心原因
  • 降低维护成本:同服务多方法复用的逻辑如果散落在各处,后续需要调整逻辑(比如修改返回的HTTP状态码、统一增加空校验日志、调整异常返回格式)时,只需要修改一处即可,避免逐个修改漏改导致的Bug。
  • 提升业务代码可读性:抽取后业务方法内只保留核心业务流程,不会被大量重复的校验逻辑淹没,代码更简洁易读。
  • 统一规范约束:统一抽取的校验逻辑可以保证全服务的空校验处理逻辑一致,不会出现不同开发写的校验返回格式不统一的问题。
推荐的实现方案

你可以结合全局异常处理来做更优雅的封装,完全去掉业务代码里的校验返回逻辑:

  1. 先封装一个通用校验工具类
public class ValidationUtils {
    /**
     * 校验对象非空,为空则抛出传入的自定义异常
     */
    public static <T> T checkNotNull(T obj, Supplier<RuntimeException> exceptionSupplier) {
        if (obj == null) {
            throw exceptionSupplier.get();
        }
        return obj;
    }
}
  1. 配合Spring全局异常处理器统一转换异常为返回值
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = {QualifierKeyNotFoundException.class, ScopeNotFoundException.class, AppNotFoundException.class})
    public ResponseEntity<String> handleCustomNotFoundException(RuntimeException e) {
        return new ResponseEntity<>(e.getMessage(), HttpStatus.OK);
    }
}
  1. 优化后你的业务代码可以简化为:
QualifierKeyEntity qualifierKeyEntity = ValidationUtils.checkNotNull(
    findKeyById(qualifierValue.getQualifierKeyId()),
    QualifierKeyNotFoundException::new
);

Scope scope = ValidationUtils.checkNotNull(
    scopeService.findByScopeId(qualifierKeyEntity.getScopeEntity().getScopeId()),
    () -> new ScopeNotFoundException(qualifierKeyEntity.getScopeEntity().getScopeId())
);

App app = ValidationUtils.checkNotNull(
    appService.getAppByAppId(appId),
    AppNotFoundException::new
);

如果你的自定义异常属于对应业务域的通用校验逻辑,也可以直接把校验逻辑下沉到对应Service内部,比如scopeService.findByScopeId方法内部直接判断空值抛出ScopeNotFoundException,上层调用方完全不需要再做校验,更符合单一职责原则。

内容的提问来源于stack exchange,提问作者Gentle Chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:24:01