Spring Boot中Hibernate Validator不生效,BindingResult.hasErrors总返回false
问题原因及解决方案
校验不生效问题可按以下优先级排查解决:
1. 确认Spring MVC是否开启了注解驱动与校验支持
如果你使用XML配置Spring MVC,需要在配置文件中加入<mvc:annotation-driven/>标签,该标签会自动注册校验器,识别@Valid和Jakarta Validation约束注解。
如果你使用Java类配置Spring MVC,需要在配置类上添加@EnableWebMvc注解,同时显式注册校验器,示例代码如下:@Configuration @EnableWebMvc @ComponentScan(basePackages = "mvc") public class MvcConfig implements WebMvcConfigurer { @Bean public LocalValidatorFactoryBean validator() { return new LocalValidatorFactoryBean(); } @Override public Validator getValidator() { return validator(); } }2. 优化字段校验规则适配表单场景
Spring MVC默认会将表单提交的空输入转换为空字符串""而非null,此时@NotNull注解不会触发,虽然你配置了@Size(min=1),但如果用户输入全空格也会通过校验。建议将lastName字段的校验注解替换为@NotBlank(需导入jakarta.validation.constraints.NotBlank),该注解专门用于字符串必填校验,要求字段非null、去除首尾空格后长度至少为1,更符合表单必填项的校验需求,修改后的实体类字段代码如下:@NotBlank(message="is required") private String lastName;3. 确认版本兼容性
Hibernate Validator 7对应Jakarta Validation API 3.0+,仅支持Spring 5.3及以上版本。如果你的Spring版本低于5.3,无法识别jakarta.*包下的校验注解,会导致校验不生效。这种情况有两种解决方式:- 升级Spring框架到5.3及以上版本
- 降级Hibernate Validator到6.x版本,同步将代码中所有
jakarta.validation的导入替换为javax.validation
4. 确认参数顺序正确
你当前代码中BindingResult参数紧跟在@Valid修饰的实体参数之后,这个顺序是符合要求的,如果顺序错误(比如中间插入了其他参数)也会导致校验结果无法被正确接收。
内容的提问来源于stack exchange,提问作者joe

