spring boot 全局异常处理通过 `@controlleradvice` 配合 `@exceptionhandler` 捕获全局 id 异常。具体做法是定义一个专门处理 `illegalargumentexception`(通常由 id 转换失败引发)或自定义 id 校验异常的 handler,在方法上标注异常类型并返回统一的错误响应结构。这样当 controller 层因 id 格式错误或类型不匹配抛出异常时,会被统一拦截并转化为标准的 json 错误信息,避免暴露堆栈细节。

如何配置全局异常处理器类
需要创建一个被 `@RestControllerAdvice` 或 `@ControllerAdvice` 注解的类,并在其中编写处理特定 ID 异常的公共方法。该方法接收异常对象作为参数,利用 Spring MVC 的 `ResponseEntity` 构建 HTTP 响应状态码和错误体。对于 ID 异常,通常是因为前端传递了非数字字符串给后端期望 Long 类型的参数,或者手动校验逻辑失败抛出的异常。配置的关键在于准确指定 `@ExceptionHandler` 中的异常类,确保它能覆盖到所有相关的 ID 解析场景。

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 GlobalIdExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<ErrorResponse> handleIllegalArgument(IllegalArgumentException ex) {
ErrorResponse error = new ErrorResponse(400, "Invalid ID format: " + ex.getMessage());
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
}
上述代码定义了一个全局异常处理器。当任何 Controller 中抛出 `IllegalArgumentException` 时,都会进入此方法。`ErrorResponse` 是一个简单的 DTO,包含状态码和消息字段。这种处理方式确保了所有 ID 相关的非法输入都能得到一致的反馈。开发者只需关注业务逻辑中的 ID 校验,无需在每个 Controller 方法中重复 try-catch 块。
如何处理自定义 ID 校验异常
除了依赖框架自动抛出的异常,更推荐的做法是定义一个自定义异常类,例如 `InvalidIdException`,用于明确标识 ID 校验失败的场景。在 Service 或 Controller 层进行 ID 合法性检查时主动抛出该异常。在全局异常处理器中单独添加针对 `InvalidIdException` 的处理方法,可以提供更精确的错误提示,比如区分“ID 不存在”和“ID 格式错误”。这种方式提高了代码的可读性和维护性,使得异常语义更加清晰。

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 GlobalCustomIdExceptionHandler {
@ExceptionHandler(InvalidIdException.class)
public ResponseEntity<ErrorResponse> handleInvalidId(InvalidIdException ex) {
ErrorResponse error = new ErrorResponse(422, ex.getMessage());
return new ResponseEntity<>(error, HttpStatus.UNPROCESSABLE_ENTITY);
}
}
// 自定义异常类
public class InvalidIdException extends RuntimeException {
public InvalidIdException(String message) {
super(message);
}
}
这段代码展示了如何扩展全局异常处理以支持自定义异常。`InvalidIdException` 继承自 `RuntimeException`,属于非受检异常,适合用于业务逻辑校验失败的场景。在处理函数中,我们返回 422 Unprocessable Entity 状态码,这在 RESTful API 中常用于表示客户端请求语法正确但语义错误的情况。结合之前的 `GlobalIdExceptionHandler`,系统现在可以同时处理框架级和用户级的 ID 异常,形成完整的全局异常捕获机制。
当 ID 为 null 时全局异常处理会返回什么
当 ID 参数为 null 时,如果 Controller 方法签名允许 null 值且未做额外校验,通常不会触发异常,而是进入业务逻辑导致后续数据库查询失败或空指针异常。但如果使用了 `@Valid` 注解配合 Bean Validation,并且 ID 字段标记了 `@NotNull`,则会在参数绑定阶段抛出 `MethodArgumentNotValidException`。此时,全局异常处理器需要额外处理这个异常类型,将其转换为友好的 ID 缺失提示。若未配置此类处理,默认可能返回 400 Bad Request 或 500 Internal Server Error,具体取决于 Spring Boot 的默认错误映射行为。


















