在 spring boot 中,通过定义一个全局异常处理器类并添加 @restcontrolleradvice 注解,可以拦截所有控制器抛出的异常,并统一返回包含状态码、错误信息和详细堆栈的 json 格式。具体做法是创建一个继承自 responseentityexceptionhandler 的类,使用 @exceptionhandler 方法处理特定异常(如 methodargumentnotvalidexception),并在其中构建统一的响应对象,从而确保前端接收到结构一致的错误数据。

如何捕获参数校验失败并提取字段错误信息?
当请求参数违反 @Valid 或 @Validated 约束时,Spring 会抛出 MethodArgumentNotValidException。要提取具体的字段错误,需要在异常处理方法中获取 BindingResult,遍历其 getFieldErrors() 列表,将每个字段的错误消息收集到一个列表中,最后封装进统一响应体返回。这样前端就能明确知道哪个字段出错以及具体原因。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.List;
import java.util.stream.Collectors;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<errorresponse> handleValidationExceptions(
MethodArgumentNotValidException ex) {
List<string> errors = ex.getBindingResult().getFieldErrors()
.stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.toList());
ErrorResponse response = new ErrorResponse(400, "参数校验失败", errors);
return ResponseEntity.badRequest().body(response);
}
}</string></errorresponse>
如何处理未捕获的业务异常并返回默认错误?
对于未在代码中显式处理的业务异常(如自定义的 BusinessException),可以通过在 @RestControllerAdvice 中添加一个通用的 @ExceptionHandler(Exception.class) 方法来兜底。该方法接收任意 Exception 实例,记录日志后,返回一个包含 HTTP 500 状态码和通用错误消息的统一响应,防止敏感堆栈信息泄露给客户端,同时保持接口响应格式的一致性。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<errorresponse> handleBusinessException(
BusinessException ex) {
ErrorResponse response = new ErrorResponse(ex.getCode(), ex.getMessage(), null);
return ResponseEntity.status(ex.getStatus()).body(response);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<errorresponse> handleGenericException(Exception ex) {
ErrorResponse response = new ErrorResponse(500, "服务器内部错误", null);
return ResponseEntity.internalServerError().body(response);
}
}</errorresponse></errorresponse>
统一响应体 ErrorResponse 的结构设计是怎样的?
为了实现真正的统一格式,需要定义一个简单的 POJO 类 ErrorResponse。该类通常包含三个核心字段:status(整型状态码)、message(字符串错误描述)和 details(可选的列表或对象,用于存放详细错误信息)。这种结构确保了无论发生何种异常,JSON 输出的键名和层级都保持一致,便于前端进行统一的解析和展示逻辑处理。











