@Valid 校驗無效,BindingResult未獲得錯誤的解決
@Valid 校驗失效
問題描述
使用@Valid校驗實體類中的屬性stuTele
import javax.validation.constraints.Size; ... @Size(min = 11,max = 11,message = "請輸入11位手機號碼") private String stuTele;
Controller中,用@Valid註解對傳入的student對象屬性值校驗
public String updateStuMsg(@Valid Student student, BindingResult bindingResult, Model model, HttpSession httpSession){......}
在傳入錯誤參數後,發現bindingResult中記錄的error為0,說明校驗無效
解決過程
檢查引入的依賴:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>7.0.1.Final</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>
在將hibernate-validator的版本切換到 5.4.1.Final 後,發現校驗正常
所以定位為依賴的版本問題。
我的springboot版本為2.5.1,在將依賴替換為下面的內容後,校驗生效
<!-- 此處沒有指定版本<version>,默認會使用和當前springboot匹配的版本也就是2.5.1 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
進入spring-boot-starter-validation 裡面,查看它的依賴項,其中有這樣一條
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.2.0.Final</version> <scope>compile</scope> </dependency>
所以在外部修改依賴的時候,也可以直接使用這一版本。
validation-api 這條依賴可以不用保留。
那麼最新的7.0.1.Final版本該如何使用?官方文檔裡是這樣說的
Jakarta Bean Validation 定義瞭與 CDI(Jakarta EE 的上下文和依賴註入)的集成點。如果您的應用程序在不提供這種開箱即用集成的環境中運行,您可以通過將以下 Maven 依賴項添加到您的 POM 來使用 Hibernate Validator CDI 可移植擴展:
示例 1.3:Hibernate Validator CDI 可移植擴展 Maven 依賴項
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>7.0.1.Final</version> </dependency>
請註意,在 Java EE 應用程序服務器上運行的應用程序通常不需要添加此依賴項。
那麼,隻需要把前面的依賴都替換成這一條,就可以瞭
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>7.0.1.Final</version> </dependency>
使用bindingResult做參數校驗
在控制類中
@RequestMapping("/create") public void create(@Valid OrderForm orderForm, BindingResult bindingResult){ if(bindingResult.hasErrors()){ log.error("【創建訂單參數不正確】,orderForm={}",orderForm); //bindingResult.getFieldError().getDefaultMessage()可以獲取到錯誤的提示 throw new OrderException(ResultEnums.PARAM_ERROR.getCode(),bindingResult.getFieldError().getDefaultMessage()); } }
實體類OrderForm
@Data public class OrderForm { @NotEmpty(message = "姓名必填") private String name;//買傢姓名 @NotEmpty(message = "手機號必填") private String phone;//買傢手機號 @NotEmpty(message = "地址必填") private String address;//買傢地址 @NotEmpty(message = "openid必填") private String openid;//買傢微信 @NotEmpty(message = "購物車不能為空") private String items;//購物車 }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 如何解決Spring in action @valid驗證不生效的問題
- springmvc項目使用@Valid+BindingResult遇到的問題
- Java中的Valid和Validated的比較內容
- springboot表單提交之validator校驗
- 如何使用Bean Validation 解決業務中參數校驗