Validator框架@Min/@Max/@NotBlank校验注解不生效问题求助
Spring Validator 校验不生效问题修复方案
以下是对应场景的所有故障点与修复方式:
- 依赖缺失导致校验完全不触发
Spring Boot 2.3.0及以上版本中,校验组件不再默认随spring-boot-starter-web引入,未手动引入spring-boot-starter-validation依赖时,@Valid注解不会生效,这是该问题的最高发原因。
Maven项目在pom.xml中添加如下依赖即可:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> - 校验注解使用错误
你在UserDTO的字符串类型name字段上使用的@Min/@Max注解仅支持校验数值类型的大小,对字符串长度校验无任何效果,字符串长度校验需使用@Size注解,与CustomerDTO中的写法保持一致。 - 手动实例化的对象不会自动触发校验
控制器方法中通过new关键字手动创建的UserDTO对象不归Spring容器管理,即使字段上加了校验注解也不会被自动拦截校验。如果需要校验这类手动创建的对象,需注入Validator实例手动执行校验:@Autowired private Validator validator; @PostMapping(path = "/nameChange") public void update(@Valid @RequestBody CustomerDTO customerDTO){ System.out.println(customerDTO.getName()); UserDTO userDTO = new UserDTO(); userDTO.setName(customerDTO.getName()); // 手动触发校验 Set<ConstraintViolation<UserDTO>> validateResult = validator.validate(userDTO); if (!validateResult.isEmpty()) { throw new ConstraintViolationException(validateResult); } System.out.println(userDTO.getName()); } - 正则规则存在漏洞
两个DTO中@Pattern注解配置的正则^[a-zA-Z0-9_]+缺少结束匹配符$,仅会校验字符串开头的字符是否合规,字符串后续部分即使包含特殊字符也会通过校验,需修正为^[a-zA-Z0-9_]+$才能实现全字符串匹配校验。 - 补充说明
校验触发后默认会抛出MethodArgumentNotValidException,未配置全局异常处理时接口会直接返回400状态码,可通过@RestControllerAdvice编写全局异常捕获逻辑,自定义错误信息的返回格式。如果引入依赖后入参校验依然不生效,请检查项目中是否存在自定义的@RequestBody参数解析器、全局拦截器,覆盖了Spring MVC默认的参数解析与校验逻辑。
内容的提问来源于stack exchange,提问作者arsenal_random_profile
相关产品推荐
相关产品推荐

