@Valid 注解通常用于對象屬性字段的規(guī)則檢測,具體啥意思,下面讓我娓娓道來:
下面我們以新增一個員工為功能切入點,以常規(guī)寫法為背景,慢慢烘托出 @Valid 注解用法詳解。
那么,首先,我們會有一個員工對象 Employee,如下 :首先我們會有一個員工對象 Employee,如下 :
/**
* 員工對象
*
* @author sunnyzyq
* @since 2019/12/13
*/
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 中會有一個對應(yīng)都新增方法 add(),如下:
@Controller
public class TestController {
@RequestMapping("/add")
@ResponseBody
public String add(Employee employee) {
// TODO 保存到數(shù)據(jù)庫
return "新增員工成功";
}
}
現(xiàn)在要求:員工的名稱不能為空,且長度不能超過10個字符,那么我們以前的做法大致如下:
寫完,我們啟動項目測試下:
可以看到,和我們料想中的一樣,毫無問題。
除了名稱外,我們規(guī)定年齡也是必填項,且范圍在1到100歲,那么此時,我們需要增加對應(yīng)判定代碼如下:
在這里插入圖片描述
那么問題來了,現(xiàn)在員工對象 Employee 就 2 個字段,我們就寫了 10 多行的代碼驗證,要是有20個字段,豈不是要寫 100 多行代碼?通常來說,當(dāng)一個方法中的無效業(yè)務(wù)代碼量過多時,往往代碼設(shè)計有問題,當(dāng)然這不是我們所想看到都結(jié)果。
那么如何解決呢?首先大家應(yīng)該會想到將對應(yīng)的驗證過程抽成一個驗證方法,如下:
這樣來看,我們的業(yè)務(wù)方法就清爽多了。
在這里插入圖片描述
但這種方式只是抽了一個方法,有一種換湯不換藥的感覺,雖然業(yè)務(wù)方法看起來清爽了很多,但書寫代碼量并沒有下降,反而還多出了一個方法,這也不是我們理想中的樣子。
此時,我們引出 Spring 中的 @valid 注解,這些問題就可以迎刃而解了,具體如下:
首先,我們在 Maven 配置中引入 @valid 的依賴:
如果你是 springboot 項目,那么可以不用引入了,已經(jīng)引入了,他就存在于最核心的 web 開發(fā)包里面。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
如果你不是 springboot 項目,那么引入下面依賴即可:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
那么針對上面情景,我們可以對我們的代碼進行優(yōu)化了。
首先我們在 Employee 類的屬性上打上如下注解:
package com.zyq.beans;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
/**
* 員工對象
*
* @author sunnyzyq
* @since 2019/12/13
*/
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 對應(yīng)方法上,對這個員工標(biāo)上 @Valid 注解,表示我們對這個對象屬性需要進行驗證,
既然驗證,那么就肯定會有驗證結(jié)果,所以我們需要用一個東西來存放驗證結(jié)果,做法也很簡單,在參數(shù)直接添加一個BindingResult,具體如下:
對應(yīng)獲取驗證結(jié)果的代碼如下:
OK ! 萬事俱備 !我們進行測試下:
可以看到,代碼不但簡潔了很多,結(jié)果和預(yù)期的也一模一樣!很棒吧?。?/p>
常用注解:
除了剛剛都注解,最后再附加2個常用注解,我就直接貼圖了,基本上這6個注解可以解決99%的字段,其他注解我就不貼圖了,如果不滿足,自己問百度。文章來源:http://www.zghlxwxcb.cn/news/detail-800042.html
全部注解:文章來源地址http://www.zghlxwxcb.cn/news/detail-800042.html
到了這里,關(guān)于如何優(yōu)雅的寫代碼-替代大量if else的@valid、@validated注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!