在 spring boot 中统一映射自定义异常,核心做法是定义一个全局异常处理器类,使用 @restcontrolleradvice 注解并配合 @exceptionhandler 方法拦截特定异常。当业务代码抛出这些异常时,spring mvc 会自动捕获它们,并通过返回统一的 json 结构(如包含错误码和消息)来响应客户端,从而避免将堆栈信息泄露给前端。

如何定义全局异常处理器的基本结构
要构建这个机制,需要创建一个继承自 ResponseEntityExceptionHandler 的类,并在其上标注 @RestControllerAdvice。在这个类中,编写一个被 @ExceptionHandler 标记的方法,指定它要处理的异常类型。该方法接收异常对象作为参数,并返回一个 ResponseEntity 对象,其中封装了 HTTP 状态码和自定义的错误响应体。这样,所有抛出的异常都会被这个方法统一接管。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<errorresponse> handleCustomException(CustomException ex) {
ErrorResponse error = new ErrorResponse(ex.getErrorCode(), ex.getMessage());
return ResponseEntity.status(ex.getHttpStatus()).body(error);
}
}</errorresponse>
如何处理不同 HTTP 状态的异常映射
在实际开发中,不同的业务错误对应不同的 HTTP 状态码,例如 400 表示参数错误,500 表示服务器内部错误。通过在 @ExceptionHandler 方法中获取异常实例的 HTTP 状态码,并将其传递给 ResponseEntity 的构造器,可以实现细粒度的状态码控制。此外,还可以为未捕获的通用异常添加一个兜底处理方法,确保任何意外错误都能以友好的 JSON 格式返回,而不是默认的白页或堆栈跟踪。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomException.class)
public ResponseEntity<errorresponse> handleCustomException(CustomException ex) {
return ResponseEntity.status(ex.getHttpStatus())
.body(new ErrorResponse(ex.getErrorCode(), ex.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<errorresponse> handleGenericException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("SYSTEM_ERROR", "An unexpected error occurred"));
}
}</errorresponse></errorresponse>
基于 CustomException 中 getErrorCode() 的具体问题
当自定义异常 CustomException 中包含一个 getErrorCode() 方法时,全局处理器可以直接调用该方法来获取具体的业务错误码。这允许前端根据错误码进行更精细的逻辑判断,例如显示特定的用户提示或执行重试策略。只要异常对象正确传递到处理器方法中,这个字段就能被稳定地提取并放入响应体的 JSON 中,无需额外的转换逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











