从数据库查询结果执行null校验的重复代码是否有必要统一抽取?
结论
非常有必要对这类重复的空校验逻辑做统一抽取
抽取的核心原因
- 降低维护成本:同服务多方法复用的逻辑如果散落在各处,后续需要调整逻辑(比如修改返回的HTTP状态码、统一增加空校验日志、调整异常返回格式)时,只需要修改一处即可,避免逐个修改漏改导致的Bug。
- 提升业务代码可读性:抽取后业务方法内只保留核心业务流程,不会被大量重复的校验逻辑淹没,代码更简洁易读。
- 统一规范约束:统一抽取的校验逻辑可以保证全服务的空校验处理逻辑一致,不会出现不同开发写的校验返回格式不统一的问题。
推荐的实现方案
你可以结合全局异常处理来做更优雅的封装,完全去掉业务代码里的校验返回逻辑:
- 先封装一个通用校验工具类
public class ValidationUtils { /** * 校验对象非空,为空则抛出传入的自定义异常 */ public static <T> T checkNotNull(T obj, Supplier<RuntimeException> exceptionSupplier) { if (obj == null) { throw exceptionSupplier.get(); } return obj; } }
- 配合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); } }
- 优化后你的业务代码可以简化为:
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
相关产品推荐
相关产品推荐

