使用 @controlleradvice 结合 @exceptionhandler 注解可以捕获提交失败异常。具体做法是定义一个全局异常处理类,在其中编写针对特定异常(如 methodargumentnotvalidexception)的处理方法,该方法返回统一的错误响应对象,从而拦截并处理参数校验失败等提交问题。

@ControllerAdvice 如何拦截参数校验异常
当请求参数不符合约束时,Spring Boot 会抛出 MethodArgumentNotValidException。通过在全局异常处理器中捕获该异常,可以提取具体的字段错误信息并返回给前端。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<map object>> handleValidationExceptions(
MethodArgumentNotValidException ex) {
Map<string object> body = new HashMap();
body.put("status", 400);
body.put("message", "参数校验失败");
Map<string string> errors = new HashMap();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage()));
body.put("errors", errors);
return ResponseEntity.badRequest().body(body);
}
}</string></string></map>
上述代码定义了全局异常处理器。当发生 MethodArgumentNotValidException 时,它会遍历字段错误,将字段名和默认消息存入 errors 映射中,最终返回包含状态码、通用消息和详细错误的 JSON 响应。
如何处理 ConstraintViolationException
对于路径变量或查询参数的校验失败,Spring Boot 会抛出 ConstraintViolationException。需要在同一个或不同的全局处理器中单独捕获该异常,以提供一致的错误反馈。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class)
public ResponseEntity<map object>> handleConstraintViolation(
ConstraintViolationException ex) {
Map<string object> body = new HashMap();
body.put("status", 400);
body.put("message", "参数校验失败: " + ex.getMessage());
return ResponseEntity.badRequest().body(body);
}
}</string></map>
这段代码专门处理 ConstraintViolationException。它直接获取异常中的消息,并将其封装在标准响应结构中返回。这确保了无论是请求体还是 URL 参数校验失败,前端都能收到格式统一的错误信息。
自定义校验注解的异常处理
如果使用了自定义的校验注解,其异常处理逻辑与内置注解类似,但可能需要更精细的错误信息提取。例如,自定义注解 @MyCustomConstraint 失败时同样会触发 MethodArgumentNotValidException,只需确保在 GlobalExceptionHandler 中正确解析即可。











