在 Spring Boot 中,异常处理有多种方式,通常建议统一处理异常,使接口返回结构一致。下面按常用程度和最佳实践来讲解。
@ControllerAdvice + @ExceptionHandler(✅ 最推荐)这是 全局异常处理 的标准方式。
public class Result<T> {
private int code;
private String message;
private T data;
public Result(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public static <T> Result<T> success(T data) {
return new Result<>(200, "success", data);
}
public static <T> Result<T> error(int code, String message) {
return new Result<>(code, message, null);
}
}
public class BusinessException extends RuntimeException {
private int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
// 处理自定义异常
@ExceptionHandler(BusinessException.class)
public Result<Void> handleBusinessException(BusinessException e) {
return Result.error(e.getCode(), e.getMessage());
}
// 处理空指针等运行时异常
@ExceptionHandler(RuntimeException.class)
public Result<Void> handleRuntimeException(RuntimeException e) {
return Result.error(500, "系统异常:" + e.getMessage());
}
// 处理参数校验异常(@Valid)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Void> handleValidException(MethodArgumentNotValidException e) {
String message = e.getBindingResult()
.getFieldError()
.getDefaultMessage();
return Result.error(400, message);
}
}
适用于某个 Controller 特有异常。
@RestController
@RequestMapping("/user")
public class UserController {
@ExceptionHandler(IllegalArgumentException.class)
public Result<Void> handleIllegalArgument(IllegalArgumentException e) {
return Result.error(400, e.getMessage());
}
}
⚠️ 不推荐大规模使用,不利于统一管理。
public class UserDTO {
@NotBlank(message = "用户名不能为空")
private String username;
@Min(value = 1, message = "年龄必须大于0")
private Integer age;
}
@PostMapping("/save")
public Result<Void> save(@Valid @RequestBody UserDTO dto) {
return Result.success(null);
}
异常会被 MethodArgumentNotValidException 捕获。
spring:
mvc:
throw-exception-if-no-handler-found: true
web:
resources:
add-mappings: false
这样 404 会抛异常,可被 @ExceptionHandler 捕获。
✅ 使用 @RestControllerAdvice 做全局异常处理
✅ 自定义 BusinessException 区分业务异常
✅ 统一返回结构(code / message / data)
✅ 参数校验异常单独处理
✅ 不要直接返回 Exception 堆栈给前端
如果你愿意,我也可以帮你:
你现在是学习阶段还是已经在做项目?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。