如何解决handleMethodArgumentNotValid对Postman请求参数不生效问题
问题解决:全局异常处理器适配非@RequestBody参数校验
你的全局异常处理器只处理了@RequestBody参数校验失败抛出的MethodArgumentNotValidException,但当校验非请求体参数(比如URL参数、表单参数)时,Spring会抛出ConstraintViolationException,原处理器无法捕获该异常,导致失效。
要让处理器同时支持两种场景,只需在GlobalExceptionHandler中新增针对ConstraintViolationException的处理方法,统一返回格式即可:
import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; 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 org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @ControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { // 处理@RequestBody参数校验失败 @Override protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) { Map<String, List<String>> map = new HashMap<>(); List<String> errors = ex.getBindingResult() .getFieldErrors() .stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); map.put("message", errors); return new ResponseEntity<>(map, HttpStatus.BAD_REQUEST); } // 处理非@RequestBody参数校验失败(如URL参数、表单参数) @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex, WebRequest request) { Map<String, List<String>> map = new HashMap<>(); List<String> errors = ex.getConstraintViolations() .stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); map.put("message", errors); return new ResponseEntity<>(map, HttpStatus.BAD_REQUEST); } }
说明:
handleConstraintViolation方法通过@ExceptionHandler(ConstraintViolationException.class)指定捕获该异常- 从
ConstraintViolationException中提取默认校验提示消息,和原有返回格式保持一致,满足"仅返回默认提示消息"的需求
内容的提问来源于stack exchange,提问作者Ko Ye
相关产品推荐
相关产品推荐

