使用 @controlleradvice 配合 @exceptionhandler 可以捕获方法参数异常。具体做法是定义一个全局异常处理类,在类上添加 @restcontrolleradvice 注解,然后编写一个处理方法级异常的方法,该方法参数为 methodargumentnotvalidexception(用于校验失败)或 bindexception(用于表单绑定失败),并返回统一的错误响应对象。

@ControllerAdvice 如何拦截参数校验异常
它通过拦截 HandlerExceptionResolver 链来工作。当 Spring MVC 发现参数校验失败时,会抛出 MethodArgumentNotValidException,全局处理器捕获该异常并提取错误信息。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<string> handleValidationExceptions(MethodArgumentNotValidException ex) {
StringBuilder errors = new StringBuilder();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.append(error.getField()).append(": ").append(error.getDefaultMessage()).append("\n"));
return ResponseEntity.badRequest().body(errors.toString());
}
}</string>
如何处理非校验类的参数绑定异常
对于类型转换或格式错误的参数,Spring 会抛出 BindException 或 ConstraintViolationException。需要单独定义 @ExceptionHandler 方法来处理这些情况,确保所有类型的参数异常都能被统一捕获。

import org.springframework.validation.BindException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleBindException(BindException ex) {
return "Parameter binding failed: " + ex.getMessage();
}
自定义校验注解的异常处理逻辑
如果使用了自定义校验注解,异常处理逻辑与标准注解一致。只需确保自定义注解正确配置了 message 属性,并在 @ExceptionHandler 中通过 error.getDefaultMessage() 获取即可。











