使用 @restcontrolleradvice 结合 @exceptionhandler 可以统一捕获权限变更异常。具体做法是定义一个全局异常处理类,在方法上指定要捕获的异常类型(如自定义的 permissionchangeexception),并返回统一的 json 响应结构。这样当业务逻辑中抛出该异常时,spring boot 会自动拦截并调用对应的方法进行处理,避免错误信息直接暴露给前端或导致页面崩溃。

如何定义并抛出权限变更异常
首先需要创建一个继承自 RuntimeException 的自定义异常类,以便携带具体的错误信息。在业务代码中,当检测到权限状态发生非法变更或需要强制刷新权限时,实例化该异常并抛出。这确保了异常能够沿着调用栈向上传播,最终被全局处理器捕获。

public class PermissionChangeException extends RuntimeException {
public PermissionChangeException(String message) {
super(message);
}
}
在 Service 层模拟抛出异常:
@Service
public class UserService {
public void updateRole(Long userId, String newRole) {
if ("ADMIN".equals(newRole)) {
throw new PermissionChangeException("Cannot change to ADMIN role");
}
// ... other logic
}
}
如何配置全局异常处理器
定义一个标注了 @RestControllerAdvice 的类,并在其中编写处理 PermissionChangeException 的方法。该方法应标注 @ExceptionHandler 并指定异常类型。方法返回值可以是自定义的响应对象,通常包含状态码、错误消息和数据字段。Spring MVC 会自动将返回值序列化为 JSON 响应体。

@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(PermissionChangeException.class)
public ResponseEntity<apiresponse> handlePermissionChange(PermissionChangeException ex) {
ApiResponse response = new ApiResponse(403, ex.getMessage(), null);
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(response);
}
}</apiresponse>
权限变更异常的具体返回结构是什么
当触发权限变更异常时,API 会返回一个 HTTP 403 状态码,响应体为 JSON 格式。例如:{"code": 403, "message": "Cannot change to ADMIN role", "data": null}。这种结构化的响应便于前端解析并展示友好的错误提示,同时保持了接口的一致性。











