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