Springboot?如何使用BindingResult校驗(yàn)參數(shù)
使用BindingResult校驗(yàn)參數(shù)
1、創(chuàng)建一個(gè)參數(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)的,如果有多個(gè)@Valid,那么每個(gè)@Valid后面都需要添加BindingResult用于接收bean中的校驗(yàn)信息
@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 -> { //日志打印不符合校驗(yàn)的字段名和錯誤提示 log.error("error field is : {} ,message is : {}", fieldError.getField(), fieldError.getDefaultMessage()); }); for(int i=0;i<fieldErrors.size();i++){ //控制臺打印不符合校驗(yàn)的字段名和錯誤提示 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é)果我并沒有返回錯誤信息,在此只是在控制臺打印出來,實(shí)際情況再根據(jù)實(shí)際需要返回給前臺呈現(xiàn)
4、常用校驗(yàn)注解
@Null
只能是null@NotNull
不能為null 注意用在基本類型上無效,基本類型有默認(rèn)初始值@AssertFalse
必須為false@AssertTrue
必須是true
字符串/數(shù)組/集合檢查:(字符串本身就是個(gè)數(shù)組)
@Pattern(regexp="reg")
驗(yàn)證字符串滿足正則@Size(max, min)
驗(yàn)證字符串、數(shù)組、集合長度范圍@NotEmpty
驗(yàn)證字符串不為空或者null@NotBlank
驗(yàn)證字符串不為null或者trim()后不為空
數(shù)值檢查:同時(shí)能驗(yàn)證一個(gè)字符串是否是滿足限制的數(shù)字的字符串
@Max
規(guī)定值得上限int@Min
規(guī)定值得下限@DecimalMax("10.8")
以傳入字符串構(gòu)建一個(gè)BigDecimal,規(guī)定值要小于這個(gè)值@DecimalMin
可以用來限制浮點(diǎn)數(shù)大小@Digits(int1, int2)
限制一個(gè)小數(shù),整數(shù)精度小于int1;小數(shù)部分精度小于int2@Digits
無參數(shù),驗(yàn)證字符串是否合法@Range(min=long1,max=long2)
檢查數(shù)字是否在范圍之間 這些都包括邊界值
日期檢查:Date/Calendar
@Post
限定一個(gè)日期,日期必須是過去的日期@Future
限定一個(gè)日期,日期必須是未來的日期
其他驗(yàn)證:
@Vaild
遞歸驗(yàn)證,用于對象、數(shù)組和集合,會對對象的元素、數(shù)組的元素進(jìn)行一一校驗(yàn)@Email
用于驗(yàn)證一個(gè)字符串是否是一個(gè)合法的右鍵地址,空字符串或null算驗(yàn)證通過@URL(protocol=,host=,port=,regexp=,flags=)
用于校驗(yàn)一個(gè)字符串是否是合法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)用具體的驗(yàn)證器
具體的驗(yàn)證器
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表
這篇文章主要介紹了關(guān)于 Java 的數(shù)據(jù)結(jié)構(gòu)鏈表的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容2021-09-09Java?swing實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問問題
這篇文章主要介紹了Java?swing實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問,本次實(shí)驗(yàn)需要做一個(gè)GUI界面和一個(gè)連接查詢功能,在論壇上借鑒了其他大佬獲取網(wǎng)站內(nèi)容的部分代碼,然后自己做了一個(gè)及其簡陋的swing界面,算是把這個(gè)實(shí)驗(yàn)完成了,需要的朋友可以參考下2022-09-09Spring Data JPA例子代碼[基于Spring Boot、Mysql]
這篇文章主要介紹了Spring Data JPA例子代碼[基于Spring Boot、Mysql],小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實(shí)現(xiàn)
本篇文章主要介紹了OKHttp3(支持Retrofit)的網(wǎng)絡(luò)數(shù)據(jù)緩存Interceptor攔截器的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Java通過反射將 Excel 解析成對象集合實(shí)例
這篇文章主要介紹了Java通過反射將 Excel 解析成對象集合實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08