Spring Boot 3.0 WebFlux如何返回自定义验证错误信息?
Spring Boot 3.x WebFlux 自定义验证错误信息不生效的解决方法
核心问题
在WebFlux响应式环境中,请求体验证失败时抛出的异常不是Spring MVC中的MethodArgumentNotValidException,而是**ServerWebInputException**,你的全局异常处理器因捕获类型不匹配,无法进入自定义错误处理逻辑,最终触发默认400响应。
解决方案
修改全局异常处理器,捕获ServerWebInputException并从中提取验证错误信息:
修改后的全局异常处理器代码
@Slf4j @RestControllerAdvice // 替代@ControllerAdvice + @ResponseBody,写法更简洁 @RequiredArgsConstructor public class ErrorController { @ExceptionHandler(ServerWebInputException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, String> handleValidationExceptions(final ServerWebInputException ex) { // 从ServerWebInputException的根因中获取验证异常 Throwable rootCause = ex.getCause(); if (rootCause instanceof MethodArgumentNotValidException validationEx) { BindingResult bindingResult = validationEx.getBindingResult(); Map<String, String> errors = new HashMap<>(); // 提取字段错误信息 bindingResult.getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()) ); return errors; } // 处理非验证类的ServerWebInputException场景 Map<String, String> defaultError = new HashMap<>(); defaultError.put("error", ex.getMessage()); return defaultError; } }
额外优化建议
- 自定义错误提示:在注解中添加
message属性,让错误信息更直观:@NotNull(message = "组织名称不能为空") private String name; - 注解简化:控制器类上的
@Validated主要用于路径变量、请求参数的验证,请求体验证仅需保留@RequestBody上的@Valid即可,当前写法无需调整。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

