mybatis-plus 自定义异常配合数据权限拦截器的核心是:在拦截器中校验失败时抛出继承 runtimeexception 的 datapermissionexception(含错误码和提示),于 beforequery 阶段主动 throw;该异常由 @controlleradvice 全局捕获并返回标准 403 响应,同时触发事务回滚并记录 warn 日志。

MyBatis-Plus 自定义异常配合数据权限拦截器,核心在于:在拦截器中校验数据权限失败时,抛出自定义业务异常(而非 RuntimeException 或 SQL 异常),并确保该异常能被全局异常处理器捕获、统一响应,同时不干扰 MyBatis-Plus 的正常执行流程。
定义清晰的自定义异常类
建议继承 RuntimeException(避免强制 try-catch,符合 Spring 事务回滚惯例),并携带错误码和提示信息:
public class DataPermissionException extends RuntimeException {
private final int code;
public DataPermissionException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
}
例如:new DataPermissionException(40301, "无权访问目标数据")。
在数据权限拦截器中主动校验并抛出
MyBatis-Plus 的拦截器(如 InnerInterceptor)通常在 willDoQuery 或 beforeQuery 阶段介入。此处应完成权限判断逻辑(如读取当前用户租户 ID、角色数据范围、SQL 中的主键/租户字段等),校验不通过时直接 throw:
- 不要用
return null或静默过滤(易导致空结果误判) - 避免抛出
IllegalArgumentException等通用异常(不利于分类处理) - 推荐在
Executor.query()前拦截,确保 SQL 尚未执行
示例片段:
@Override
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
// 获取当前用户可访问的数据范围(如 tenant_id 列表、org_id 树路径等)
List<long> allowedTenantIds = permissionService.getAllowedTenantIds();
if (CollectionUtils.isEmpty(allowedTenantIds)) {
throw new DataPermissionException(40301, "当前用户无任何数据访问权限");
}
// 可选:动态重写 BoundSql 或注入 WHERE 条件(但抛异常更直观明确)
}</long>
配置全局异常处理器统一响应
Spring Boot 项目中,用 @ControllerAdvice 拦截自定义异常,返回标准 JSON 结构:
@ExceptionHandler(DataPermissionException.class)
public ResponseEntity<apiresponse> handleDataPermissionException(DataPermissionException e) {
ApiResponse error = ApiResponse.fail(e.getCode(), e.getMessage());
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(error);
}</apiresponse>
这样前端能明确识别为「权限不足」,而非 500 或空响应。
注意事务与日志的协同
因 DataPermissionException 是运行时异常,会触发 Spring 默认事务回滚 —— 这通常是期望行为(权限校验失败不该提交)。若需特殊控制:
- 可在 service 层用
@Transactional(noRollbackFor = DataPermissionException.class)覆盖(慎用) - 建议在全局异常处理器中记录 warn 日志,包含用户 ID、操作接口、SQL 片段(脱敏)、异常码
- 避免在拦截器里打 info 日志(可能高频刷屏)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











