Spring项目中Validation API及校验注解失效问题求助
Spring Validation校验功能失效排查
我在Spring项目里配置了Validation API和校验注解,但校验完全没起作用——输入不符合规则的内容时,系统既不拦截,也不会返回原页面。以下是相关代码文件,求帮忙排查原因:
一、实体类代码
Taco.java
package tacos; import java.util.List; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import lombok.Data; @Data public class Taco { @NotNull @Size(min=5, message="Name must be at least 5 characters long") private String name; @NotNull @Size(min=1, message="You must choose at least 1 ingredient") private List<Ingredient> ingredients; }
TacoOrder.java
package tacos; import javax.validation.constraints.Digits; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.CreditCardNumber; import java.util.List; import java.util.ArrayList; import lombok.Data; @Data public class TacoOrder { @NotBlank(message = "Delivery name is required") private String deliveryName; @NotBlank(message = "Street is required") private String deliveryStreet; @NotBlank(message = "City is required") private String deliveryCity; @NotBlank(message = "State is required") private String deliveryState; @NotBlank(message = "Zip code is required") private String deliveryZip; @CreditCardNumber(message = "Not a valid credit card number") private String ccNumber; @Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([2-9][0-9])$", message = "Must be formatted MM/YY") private String ccExpiration; @Digits(integer = 3, fraction = 0, message = "Invalid CVV") private String ccCVV; private List<Taco> tacos = new ArrayList<>(); public void addTaco(Taco taco) { tacos.add(taco); } }
二、控制器相关方法
@PostMapping public String processTaco(@Valid Taco taco, Errors errors, @ModelAttribute TacoOrder tacoOrder){ if (errors.hasErrors()) { return "design"; //@Valid - perform validation on submitted Taco Object } tacoOrder.addTaco(taco); log.info("Processing taco: {}", taco); return "redirect:/orders/current"; } @PostMapping public String processOrder(@Valid TacoOrder order, Errors errors, SessionStatus sessionStatus) { if (errors.hasErrors()) { return "orderForm"; } log.info("Order submitted: {}", order); sessionStatus.setComplete(); //setComplete - ensure session cleaned up and ready for new order return "redirect:/"; }
三、orderForm.html视图代码
<!DOCTYPE html> <html> <head> <title>Taco Cloud</title> </head> <body> <h1>Order your taco creations!</h1> <img src="@{/TacoCloud.png}" /> <h3>Your tacos in this order:</h3> <a href="@{/design}">Design another taco</a><br /> <ul> <li> taco name </li> </ul> <h3>Deliver my taco masterpieces to...</h3> Name: <input type="text" th:field="*{deliveryName}" /> <br /> Street address: <input type="text" th:field="*{deliveryStreet}" /> <br /> City: <input type="text" th:field="*{deliveryCity}" /> <br /> State: <input type="text" th:field="*{deliveryState}" /> <br /> Zip code: <input type="text" th:field="*{deliveryZip}" /> <br /> <h3>Here's how I'll pay...</h3> Credit Card #: <input type="text" th:field="*{ccNumber}" /> <span th:if="${#fields.hasErrors('ccNumber')}" th:errors="*{ccNumber}">CC Num Error</span> <br /> <label for="ccExpiration">Expiration: </label> <input type="text" th:field="*{ccExpiration}" /> <br /> <label for="ccCVV">CVV: </label> <input type="text" th:field="*{ccCVV}" /> <br /> <input type="submit" value="Submit Order" /> </body> </html>
排查方向
- 检查依赖是否齐全:
- Spring Boot 2.3+版本需单独引入
spring-boot-starter-validation依赖;非Spring Boot项目要确保引入javax.validation:validation-api和org.hibernate.validator:hibernate-validator
- Spring Boot 2.3+版本需单独引入
- 核对视图字段绑定:
- 原视图代码中部分输入框缺失
th:field绑定(比如Name、Street等字段),导致表单数据无法映射到实体类,校验自然不会触发
- 原视图代码中部分输入框缺失
- 注解包版本匹配:
- 若用Spring Boot 3.x,需把
javax.validation替换为jakarta.validation(Jakarta EE替换了原Java EE的API)
- 若用Spring Boot 3.x,需把
- 控制器参数顺序:
- 确认
@Valid标注的参数紧跟在Errors参数之前(当前代码顺序是对的,但要避免其他参数插入干扰)
- 确认
- 全局配置干扰:
- 检查是否有自定义全局异常处理器覆盖了校验错误的默认处理逻辑,导致错误未被正确捕获
内容的提问来源于stack exchange,提问作者TuuRash
相关产品推荐
相关产品推荐

