Spring boot @Validated注解以及配合@Valid的使用


 https://blog.csdn.net/MR_L_0927/article/details/84784482

 

簡單的方法是 直接在Controller內的接口參數前加上校驗注解(@NotBlank...等),此時需在類上加注解  @Validated即可.當校驗參數過多,這種方法使接口參數看起來過於臃腫,代替的選擇是使用 @Validated 注解來進行一些參數的驗證.

 

第一步 Bean實體類加注解
下面是驗證注解的類型

@Null 只能為null
@NotNull 必須不為null
@Max(value) 必須為一個不大於 value 的數字
@Min(value)  必須為一個不小於 value 的數字
@AssertFalse 必須為false
@AssertTrue 必須為true
@DecimalMax(value) 必須為一個小於等於 value 的數字
@DecimalMin(value) 必須為一個大於等於 value 的數字
@Digits(integer,fraction) 必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Past  必須是 日期 ,且小於當前日期
@Future 必須是 日期 ,且為將來的日期
@Size(max,min) 字符長度必須在min到max之間
@Pattern(regex=,flag=) 必須符合指定的正則表達式
@NotEmpty 必須不為null且不為空(字符串長度不為0、集合大小不為0)
@NotBlank  必須不為空(不為null、去除首位空格后長度不為0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Email 
必須為Email,也可以通過正則表達式和flag指定自定義的email格式

 
public class User {

@NotEmpty(message = "姓名不能為空")
private String username;

@Size(min=6 ,max= 20 ,message = "密碼長度應在6--20位之間")
private String password;
}


第二步 Controller層編寫
在需要校驗的pojo前邊添加@Validated,在需要校驗的pojo后邊添加BindingResult br接收校驗出錯信息

@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}

}
需要注意的是, BindingResult br 一定要跟在 @Validated 注解對象的后面,且當有多個@Validated
注解時,每個注解對象后面都需要添加一個 BindingResult br.即
(@Validated User user, BindingResult brOfUser,
@Validated Goods goods, BindingResult brOfGoods)

判斷是否有誤時也需要分別判斷, brOfUser.hasErrors,brOfGoods.hasErrors
而且 BindingResult 只能跟在 實體類 后面.否則會報
java.lang.IllegalStateException: An Errors/BindingResult argument is expected to be declared immediately after the model attribute, the @RequestBody or the @RequestPart arguments to which they apply: public void com.yoona.TestAnnotation.myTest(java.lang.String,org.springframework.validation.BindingResult)
 

@Validated還提供分組驗證功能

第一步 創建分組接口
public interface groupOne{
}

public interface groupTwo{
}
 

第二步 Bean實體類中添加分組
public class User {

@NotEmpty(groups={groupOne.class},message = "姓名不能為空")
private String username;

@Size(groups={groupTwo.class},min=6 ,max= 20 ,message = "密碼長度應在6--20位之間")
private String password;
}
第三步 Controller中參數添加接口
@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated({groupOne.class}) User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}
}
這樣就只驗證 User 類中的 屬性為 groupOne 組內的屬性,而 屬於 groupTwo 組內的屬性不需驗證.

默認情況下,分組驗證時無序的,但是有些情況下,驗證順序很重要(如第一個驗證不通過,后面的驗證就不需要),可以使用@GroupSequence 注解進行排序

/*
* 分組順序接口類
*/
import javax.validation.GroupSequence;

//分組序列先Frist再Second
@GroupSequence({First.class,Second.class})
public interface Group{
}


Controller層
@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated({Group.class}) User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}
在含有嵌套驗證的時候,需要 @Validated 與 @Valid 配合使用,需要注意的是,在檢驗Controller的入參是否符合規范時,使用@Validated或者@Valid在基本驗證功能上沒有太多區別.但是 @Valid 暫不支持分組功能.@Validated不能用於成員屬性上,@Valid可以.

 

public class User {
@NotNull
private String name;
@NotNull
private List<Persion> persions;
}


public class Persion {
@NotBlank(message = "性別不能為空")
private String gender;
}
此時在 Controller 中,

@RestController
@RequestMapping(value = "user")
public class UserController {

@GetMapping(value = "msg")
public String User(@Validated User user, BindingResult br) {
if(br.hasErrors()) {
return "error";
}
return "success";
}
}


@Validates 加在 User 前,只會對 User 的屬性驗證,而嵌套的 Persion 內的屬性不會驗證.如果想要全部驗證,則只需要在實體類中

public class User {
@NotNull
private String name;
@Valid //此處加該注解,就可以嵌套驗證
@NotNull
private List<Persion> persions;
}


public class Persion {
@NotBlank(message = "性別不能為空")
private String gender;
}
參數數量比較少時,可以直接使用需要的校驗注解,不需使用@Validates或@Valid.

public volid func(@NotNull @Length(min = 6, max = 6, message = "請求參數有誤") String str, HttpServletRequest rq, HttpServletResponse rp){
// .....................
}
 
————————————————
原文鏈接:https://blog.csdn.net/MR_L_0927/article/details/84784482


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM