Springboot?如何使用BindingResult校驗參數(shù)
使用BindingResult校驗參數(shù)
1、創(chuàng)建一個參數(shù)對象
import java.util.List;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
public class Parameter {
@NotEmpty(message="姓名不能為空")
private String name;
@Min(value = 18, message = "年齡必須大于18歲")
private int age;
@NotEmpty(message="hobbies不能為空")
private List<String> hobbies;
@NotBlank(message="賬號不能為空")
private String account;
@Size(min=5,max=10,message="密碼的長度應(yīng)該在5和10之間")
private String password;
@Email(message="郵箱格式錯誤")
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getHobbies() {
return hobbies;
}
public void setHobbies(List<String> hobbies) {
this.hobbies = hobbies;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}2、controller控制層寫參數(shù)接收的入口
需要注意的是@Valid 和 BindingResult 是一 一對應(yīng)的,如果有多個@Valid,那么每個@Valid后面都需要添加BindingResult用于接收bean中的校驗信息
@RequestMapping(value = "/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ResponseEntity<Pesponsibles> testBindingResult(@Valid @RequestBody Parameter parameter,BindingResult bindingResult)
{
log.info("test start");
Pesponsibles pesponsibles=new Pesponsibles();
if(bindingResult.hasErrors()){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
fieldErrors.forEach(fieldError -> {
//日志打印不符合校驗的字段名和錯誤提示
log.error("error field is : {} ,message is : {}", fieldError.getField(), fieldError.getDefaultMessage());
});
for(int i=0;i<fieldErrors.size();i++){
//控制臺打印不符合校驗的字段名和錯誤提示
System.out.println("error field is :"+fieldErrors.get(i).getField()+",message is :"+fieldErrors.get(i).getDefaultMessage());
}
// pesponsibles.setError_msg(fieldErrors);
return new ResponseEntity<>(pesponsibles, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(pesponsibles, HttpStatus.OK);
}3、傳入?yún)?shù)和控制臺打印結(jié)果
如下圖所示:


log日志編碼集沒有修改所以是亂碼,返回結(jié)果我并沒有返回錯誤信息,在此只是在控制臺打印出來,實際情況再根據(jù)實際需要返回給前臺呈現(xiàn)
4、常用校驗注解
@Null只能是null@NotNull不能為null 注意用在基本類型上無效,基本類型有默認初始值@AssertFalse必須為false@AssertTrue必須是true
字符串/數(shù)組/集合檢查:(字符串本身就是個數(shù)組)
@Pattern(regexp="reg")驗證字符串滿足正則@Size(max, min)驗證字符串、數(shù)組、集合長度范圍@NotEmpty驗證字符串不為空或者null@NotBlank驗證字符串不為null或者trim()后不為空
數(shù)值檢查:同時能驗證一個字符串是否是滿足限制的數(shù)字的字符串
@Max規(guī)定值得上限int@Min規(guī)定值得下限@DecimalMax("10.8")以傳入字符串構(gòu)建一個BigDecimal,規(guī)定值要小于這個值@DecimalMin可以用來限制浮點數(shù)大小@Digits(int1, int2)限制一個小數(shù),整數(shù)精度小于int1;小數(shù)部分精度小于int2@Digits無參數(shù),驗證字符串是否合法@Range(min=long1,max=long2)檢查數(shù)字是否在范圍之間 這些都包括邊界值
日期檢查:Date/Calendar
@Post限定一個日期,日期必須是過去的日期@Future限定一個日期,日期必須是未來的日期
其他驗證:
@Vaild遞歸驗證,用于對象、數(shù)組和集合,會對對象的元素、數(shù)組的元素進行一一校驗@Email用于驗證一個字符串是否是一個合法的右鍵地址,空字符串或null算驗證通過@URL(protocol=,host=,port=,regexp=,flags=)用于校驗一個字符串是否是合法UR
BindingResult 作用原理
controller代碼
@RequestMapping("")
public String index(@Valid User user , BindingResult bindingResult){
if (bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
ObjectError objectError = allErrors.get(0);
System.out.println(objectError.getDefaultMessage());
System.out.println(objectError.getObjectName());
System.out.println(allErrors);
}
return "index";
}請求先來到DispatcherServlet的doDispatch 方法,最終會調(diào)用ModelAttributeMethodProcessor#resolveArgument方法

調(diào)用DataBinder#validate方法后調(diào)用ConstraintTree#validateSingleConstraint,由它來調(diào)用具體的驗證器

具體的驗證器

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表
這篇文章主要介紹了關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容2021-09-09
Java?swing實現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問問題
這篇文章主要介紹了Java?swing實現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問,本次實驗需要做一個GUI界面和一個連接查詢功能,在論壇上借鑒了其他大佬獲取網(wǎng)站內(nèi)容的部分代碼,然后自己做了一個及其簡陋的swing界面,算是把這個實驗完成了,需要的朋友可以參考下2022-09-09
Spring Data JPA例子代碼[基于Spring Boot、Mysql]
這篇文章主要介紹了Spring Data JPA例子代碼[基于Spring Boot、Mysql],小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實現(xiàn)
本篇文章主要介紹了OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12

