Spring MVC项目中@Size、@NotBlank等验证注解失效求助
1. 依赖缺失检查
Jakarta Validation需要API包+实现库(如Hibernate Validator)+EL依赖才能正常工作,检查你的POM.xml是否包含以下依赖:
<!-- Jakarta Validation API --> <dependency> <groupId>jakarta.validation</groupId> <artifactId>jakarta.validation-api</artifactId> <version>3.0.2</version> </dependency> <!-- Hibernate Validator (验证实现) --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>8.0.1.Final</version> </dependency> <!-- EL依赖(用于验证表达式计算) --> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.el</artifactId> <version>5.0.1</version> </dependency>
注意版本要匹配Spring MVC版本:Spring 6+对应Jakarta Validation 3.x,Spring 5对应旧版javax.validation相关依赖。
2. Spring MVC验证配置未启用
检查Spring配置文件(XML或JavaConfig)是否开启注解驱动并配置验证器:
- XML配置方式:
<mvc:annotation-driven validator="validator"/> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> </bean>
- JavaConfig方式:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public Validator getValidator() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.setProviderClass(HibernateValidator.class); return validator; } }
未配置<mvc:annotation-driven>或@EnableWebMvc时,Spring不会自动触发验证逻辑。
3. 参数顺序与绑定检查
确认控制器方法中@Valid和BindingResult的顺序正确:@Valid必须紧跟在要验证的@ModelAttribute参数之后,且中间不能插入其他参数。你的现有代码顺序是对的,但如果后续修改时误加参数会导致验证结果无法绑定到BindingResult。
4. 字段类型与注解匹配问题
salary字段为int类型,提交空值时会触发类型转换异常而非@Max验证(int不能为null)。建议改为Integer类型,并补充@NotNull注解:
@NotNull(message = "salary is required") @Max(value = 100, message = "salary cannot exceed 100") private Integer salary;
name字段的@Size(min=2)不会触发空字符串验证(空字符串长度为0,但@Size仅检查非null值的长度),需配合@NotBlank:
@NotBlank(message = "Name is required") @Size(min = 2, message = "Name must be min 2 symbols") private String name;
5. Web.xml配置检查
确认Spring DispatcherServlet正确加载了配置文件:
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
若DispatcherServlet未正确加载配置,验证相关Bean无法初始化。
6. 注解包导入正确性
确认Employee类导入的是jakarta.validation.constraints.*而非旧版javax.validation.constraints.*,Spring 6+已完全切换到Jakarta EE规范,旧包注解不会被识别。
7. 请求方式匹配检查
确认控制器方法与表单提交方式一致:表单默认是POST提交,需在控制器方法中明确指定请求方法:
@RequestMapping(value = "/show", method = RequestMethod.POST) public String showDetails(@Valid @ModelAttribute("employee") Employee emp, BindingResult bindingResult) { // 原有逻辑 }
若控制器仅接收GET请求,表单POST提交会导致参数绑定失败,验证逻辑无法触发。
内容的提问来源于stack exchange,提问作者Pablinho

