溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用SpringMVC的@Validated注解驗證的實現(xiàn)

發(fā)布時間:2020-09-24 18:53:29 來源:腳本之家 閱讀:194 作者:J-Jian 欄目:編程語言

1、SpringMVC驗證@Validated的使用

第一步:編寫國際化消息資源文件

編寫國際化消息資源ValidatedMessage.properties文件主要是用來顯示錯誤的消息定制

edit.username.null=用戶名不能為空
edit.password.size=密碼最少{min}位,最長{max}位
......

可以將edit.username.null與edit.password.size看為參數(shù),在message中傳遞,具體請看第二步。

第二步:Bean實體類中加注解

首先介紹關(guān)于驗證注解的類型種類

@Null 限制只能為null
@NotNull 限制必須不為null
@AssertFalse 限制必須為false
@AssertTrue 限制必須為true
@DecimalMax(value) 限制必須為一個不大于指定值的數(shù)字
@DecimalMin(value) 限制必須為一個不小于指定值的數(shù)字
@Digits(integer,fraction) 限制必須為一個小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction
@Future 限制必須是一個將來的日期
@Max(value) 限制必須為一個不大于指定值的數(shù)字
@Min(value) 限制必須為一個不小于指定值的數(shù)字
@Past 驗證注解的元素值(日期類型)比當(dāng)前時間早
@Pattern(value) 限制必須符合指定的正則表達(dá)式
@Size(max,min) 限制字符長度必須在min到max之間
@NotEmpty 驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
@NotBlank 驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時會去除字符串的空格
@Email 驗證注解的元素值是Email,也可以通過正則表達(dá)式和flag指定自定義的email格式

使用 這些注解很簡單,只需要在實體類中的變量屬性前面加上該注解即可。

public class User { 
  private String id; 
  @NotEmpty(message = "{edit.username.null}")
  private String username;
  @Size(min=6 ,max= 20 ,message = "{edit.password.size}")
  private String password;
  ......
}

其中{}相當(dāng)于占位符,將min、max參數(shù)傳圖,同時也將消息文件中定制的錯誤信息傳入,當(dāng)然也可以直接不使用國際化文件,但是推薦使用,方便統(tǒng)一與修改。

public class User { 
  private String id; 
  @NotEmpty(message = "用戶名不能為空")
  private String username;
  @Size(min=6 ,max= 20 ,message = "密碼最少6位,最高20位")
  private String password;
  ......
}

第三步:Controller層的編寫

Controller層的使用,很簡單。需要在相應(yīng)的方法傳入的Bean參數(shù)前面增加注解@Validated,還有增加BindingResult參數(shù)即可,具體請看代碼示例:

@Controller 
public class UserController { 
 
  @RequestMapping("/save") 
  public String save(@Validated User user, BindingResult result) { 
    if(result.hasErrors()) { 
      return "error"; 
    } 
    return "success"; 
  } 
}

第四步:在View層顯示錯誤信息

這里就不做介紹了,實際項目中會封裝好相應(yīng)的javcscript等方法,只需要調(diào)用就可以返回頁面提示給用戶錯誤信息。

2、@Validated的分組特性

先在記錄之前,介紹一下這樣的場景:在對用戶的帳號密碼進行編輯保存以及新增是兩種不一樣的情況。

編輯修改->保存:只需要驗證username與password是否符合條件即可,不需要驗證id(因為在數(shù)據(jù)庫中id已經(jīng)存在)。

新增->保存:新增需要驗證username與password是否符合條件,還要驗證id。

這時候就用到groups分組分情況對Bean屬性變量進行驗證,也可以滿足多驗證。具體的需要一下兩個步驟

第一步:創(chuàng)建分組接口類

分組接口類只是普通的接口類并沒有多大意義,只是用來標(biāo)識這個屬性哪種情況下被驗證,這類似于java.io.Serializable  

public interface addUser{ 
} 
public interface editUser{
}

第二步:Controller方法參數(shù)中增加xxx.class接口

在對新增的用戶進行ID驗證,增加@Validated({addUser.class})接口類用來表示新增的User.getId()需要驗證。

@Controller 
public class UserController { 
 
  @RequestMapping("/saveAdd") 
  public String saveAddUser(@Validated({addUser.class}) User user, BindingResult result) { 
    if(result.hasErrors()) { 
      return "error"; 
    } 
    return "success"; 
  }

第三步:Bean中添加groups分組

在User實體類中添加groups分組@NotEmpty(groups={addUser.class})與UserController中@Validated({addUser.class})對應(yīng),說明在執(zhí)行saveAddUser新增用戶的情況下,才對新增的用戶id進行驗證。

public class User {  
  //在分組addUser時,驗證id不能為空,其他情況下不做驗證
  @NotEmpty(groups={addUser.class})
  private String id;
  @NotEmpty(message = "用戶名不能為空")
  private String username;
  @Size(min=6 ,max= 20 ,message = "密碼最少6位,最高20位")
  private String password;
  ......
}

以上三步就可以簡單地完成分組驗證,但是對分組驗證補充一下三點:

第一是:不分配groups分組時,默認(rèn)每次都需要驗證。

第二是:通過groups分組可以對同一個變量進行多個驗證,如下代碼

//對用戶名進行兩次不同情況的驗證。
@NotEmpty(groups={First.class})
@Size(min=1,max=10,groups={Second.class})
public String username;

第三是:默認(rèn)的情況下,不同的分組約束驗證是無序的,但是在有些情況下驗證的相互約束很重要(比如前一個組驗證失敗,后面的將不再驗證等情況),所以groups分組的驗證也有前后驗證順序。使用@GroupSequence注解進行排序。

/*
 * 分組順序接口類
 */
import javax.validation.GroupSequence;
//分組序列先Frist再Second
@GroupSequence({First.class,Second.class})
public interface Group{
}
 
@Controller 
public class UserController { 
 
  @RequestMapping("/saveAdd") 
  public String saveAddUser(@Validated({Group.class}) User user, BindingResult result) { 
    if(result.hasErrors()) { 
      return "error"; 
    } 
    return "success"; 
  }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI