@Valid 注解通常用于物件屬性欄位的規則檢測,
以新增一個員工為功能切入點,以常規寫法為背景,慢慢烘托出 @Valid 注解用法詳解,
那么,首先,我們會有一個員工物件 Employee,如下 :
public class Employee {
/** 姓名 */
public String name;
/** 年齡 */
public Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
然后 Cotroller 中會有一個對應都新增方法 add():
@Controller
public class TestController {
@RequestMapping("/add")
@ResponseBody
public String add(Employee employee) {
// TODO 保存到資料庫
return "新增員工成功";
}
}
需求變更,要求員工名稱不能為空,且長度不超過10個字符,我們的原始寫法:

現在規定年齡也是必填項,且范圍在1到100歲,那么此時,我們需要增加判定

現在員工物件 Employee 就 2 個欄位,我們就寫了 10 多行的代碼驗證,要是有20個欄位,豈不是要寫 100 多行代碼?
如何解決呢?
將驗證程序抽成一個驗證方法:

但這種方式只是抽了一個方法,有一種換湯不換藥的感覺,雖然業務方法看起來清爽了很多,但書寫代碼量并沒有下降,反而還多出了一個方法,
此時引出 Spring 的 @valid 注解即可:
首先,我們在 Maven 配置中引入 @valid 的依賴:
如果你是 springboot 專案,那么可以不用引入了,已經引入了,他就存在于最核心的 web 開發包里面,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
代碼優化,
首先在 Employee 類的屬性上打上如下注解:
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
public class Employee {
/** 姓名 */
@NotBlank(message = "請輸入名稱")
@Length(message = "名稱不能超過個 {max} 字符", max = 10)
public String name;
/** 年齡 */
@NotNull(message = "請輸入年齡")
@Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100)
public Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
然后再 Controller 對應方法上,對這個員工標上 @Valid 注解,表示我們對這個物件屬性需要進行驗證

用一個東西來存放驗證結果,做法也很簡單,在引數直接添加一個BindingResult:

對應獲取驗證結果的代碼如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/290649.html
標籤:java
