You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

排查方向

  1. 检查依赖是否齐全:
    • Spring Boot 2.3+版本需单独引入spring-boot-starter-validation依赖;非Spring Boot项目要确保引入javax.validation:validation-api和org.hibernate.validator:hibernate-validator
  2. 核对视图字段绑定:
    • 原视图代码中部分输入框缺失th:field绑定(比如Name、Street等字段),导致表单数据无法映射到实体类,校验自然不会触发
  3. 注解包版本匹配:
    • 若用Spring Boot 3.x,需把javax.validation替换为jakarta.validation(Jakarta EE替换了原Java EE的API)
  4. 控制器参数顺序:
    • 确认@Valid标注的参数紧跟在Errors参数之前(当前代码顺序是对的,但要避免其他参数插入干扰)
  5. 全局配置干扰:
    • 检查是否有自定义全局异常处理器覆盖了校验错误的默认处理逻辑,导致错误未被正确捕获

内容的提问来源于stack exchange,提问作者TuuRash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:24:52