Spring MVC中@Size与@NotEmpty验证注解失效问题求助
Spring MVC验证功能不生效问题排查与解决
我创建了一个简单的Spring MVC程序,想要为User类的firstName和secondName字段添加验证,使用了@Size和@NotEmpty注解。程序其他功能正常,但验证功能不生效:点击提交按钮时,预期会显示错误提示,实际却没有出现。
主要问题:依赖版本不兼容
Spring 5.3.x 基于javax.validation(JSR-380)规范,而引入的hibernate-validator:8.0.0.Final是基于jakarta.validation(Jakarta Validation 3.0)的版本,两者API包路径不同(javax vs jakarta),导致Spring无法识别验证注解,从而不执行验证逻辑。
解决步骤:
将Hibernate Validator替换为兼容Spring 5的版本(6.x系列,基于javax.validation),同时添加javax.validation的API依赖。修改后的POM依赖部分如下:
<!-- 验证API依赖 --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <!-- 兼容Spring 5的Hibernate Validator版本 --> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.5.Final</version> </dependency>
次要问题:JSP页面结构错误
authorization.jsp末尾存在多余的</form>标签,会导致HTML结构异常,可能影响表单提交和错误信息渲染。修正后的JSP代码:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <div> <div> <p>Authorization</p> <form:form action="welcome" modelAttribute="user"> <div> <label>Please enter your First name</label> <form:input path="firstName"/> <form:errors path="firstName"/> </div> <div> <label>Please enter your Second name</label> <form:input path="secondName"/> <form:errors path="secondName"/> </div> <div> <label>Please choose your department</label> <form:select path="department"> <form:options items="${user.departments}"/> </form:select> </div> <div> <input type="submit" value="Send"> </div> </form:form> </div> </div> </body> </html>
确认Controller参数顺序(你的代码已正确)
必须保证@Valid注解修饰的对象紧跟在BindingResult参数之前,这样Spring才能将验证结果绑定到BindingResult中。你的Controller代码中该顺序符合要求,无需修改:
public String showDetails(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "authorization"; } else { return "welcome"; } }
内容的提问来源于stack exchange,提问作者Vlad Zherikhov
相关产品推荐
相关产品推荐

