關(guān)于BindingResult的使用總結(jié)及注意事項(xiàng)
BindingResult總結(jié)及注意事項(xiàng)
記一個(gè)簡(jiǎn)單又好用的API:BindingResult
BindingResult使用起來(lái)很簡(jiǎn)單,一般在controller中使用
作用:用于對(duì)前端穿進(jìn)來(lái)的參數(shù)進(jìn)行校驗(yàn),省去了大量的邏輯判斷操作
相關(guān)的校驗(yàn)API
空檢查
@NotEmpty:用在集合類(lèi)上面;不能為null,而且長(zhǎng)度必須大于0@NotBlank:用在String上面;只能作用在String上,不能為null,而且調(diào)用trim()后,長(zhǎng)度必須大于0@NotNull:用在基本類(lèi)型上;不能為null,但可以為empty。
長(zhǎng)度檢查
@Size(min=,max=):驗(yàn)證對(duì)象(Array,Collection,Map,String)長(zhǎng)度是否在給定的范圍之內(nèi) 不要錯(cuò)用了異常類(lèi)型,比如在int上不可用@size@Length(min=, max=):只適用于String 類(lèi)型
Booelan檢查
@AssertTrue:驗(yàn)證 Boolean 對(duì)象是否為 true@AssertFalse:驗(yàn)證 Boolean 對(duì)象是否為 false
日期檢查
@Past:驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之前@Future:驗(yàn)證 Date 和 Calendar 對(duì)象是否在當(dāng)前時(shí)間之后@Pattern:驗(yàn)證 String 對(duì)象是否符合正則表達(dá)式的規(guī)則
其他驗(yàn)證
@Vaild遞歸驗(yàn)證,用于對(duì)象、數(shù)組和集合,會(huì)對(duì)對(duì)象的元素、數(shù)組的元素進(jìn)行一一校驗(yàn)@Email用于驗(yàn)證一個(gè)字符串是否是一個(gè)合法的右鍵地址,空字符串或null算驗(yàn)證通過(guò)@URL(protocol=,host=,port=,regexp=,flags=)用于校驗(yàn)一個(gè)字符串是否是合法URL
數(shù)值檢查
建議使用在Stirng,Integer類(lèi)型,不建議使用在int類(lèi)型上,因?yàn)楸韱沃禐?" 時(shí)無(wú)法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null
@Min:驗(yàn)證 Number 和 String 對(duì)象是否大等于指定的值@Max:驗(yàn)證 Number 和 String 對(duì)象是否小等于指定的值@DecimalMax:被標(biāo)注的值必須不大于約束中指定的最大值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最大值的字符串表示.小數(shù)存在精度@DecimalMin:被標(biāo)注的值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)是一個(gè)通過(guò)BigDecimal定義的最小值的字符串表示.小數(shù)存在精度@Digits:驗(yàn)證 Number 和 String 的構(gòu)成是否合法@Digits(integer=,fraction=):驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。
項(xiàng)目使用中遇到的問(wèn)題
一開(kāi)始傳入的參數(shù)沒(méi)有使用@Validated 修飾,結(jié)果綁定不起作用,參數(shù)校驗(yàn)不成功,加上此注解即可生效。
所以BingdingResult是要與@Validated同時(shí)使用的。
項(xiàng)目中具體使用如下:
controller中:
@ApiOperation("添加角色")
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public CommonResult create(@Validated @RequestBody UmsRole role, BindingResult bindingResult ) {
int count = roleService.create(role);
if (count > 0) {
return CommonResult.success(count);
}
return CommonResult.failed();
}
domain中:
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.Date;
@Data
public class UmsRole implements Serializable {
private Long id;
@ApiModelProperty(value = "名稱(chēng)")
@NotEmpty(message = "name不能為空!")
private String name;
@ApiModelProperty(value = "描述")
@NotEmpty(message = "描述不能為空!")
private String description;
@ApiModelProperty(value = "后臺(tái)用戶數(shù)量")
private Integer adminCount;
@ApiModelProperty(value = "創(chuàng)建時(shí)間")
private Date createTime;
@ApiModelProperty(value = "啟用狀態(tài):0->禁用;1->啟用")
private Integer status;
private Integer sort;
private static final long serialVersionUID = 1L;
調(diào)用接口返回效果:
參數(shù):
{
“name”:“test”
}
返回值:
{
“code”: 404,
“message”: “描述不能為空!”,
“data”: null
}
注意!
1.@Validated 與BindingResult 需要相鄰,否則 變量result 不能接受錯(cuò)誤信息
控制臺(tái)輸出
Field error in object 'entity' on field '變量': rejected value [null]; codes [NotNull.entity.變量,NotNull.變量,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes
2.如果使用了@Validated,那么BeanValidate也會(huì)拋出異常而不是之前的封裝在BindingResult中
總結(jié):
使用BindingResult,省去了代碼塊中的大部分校驗(yàn)
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";
}
請(qǐng)求先來(lái)到DispatcherServlet的doDispatch 方法,最終會(huì)調(diào)用ModelAttributeMethodProcessor#resolveArgument方法

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

具體的驗(yàn)證器

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- @valid 無(wú)法觸發(fā)BindingResult的解決
- springmvc項(xiàng)目使用@Valid+BindingResult遇到的問(wèn)題
- 使用@Valid+BindingResult進(jìn)行controller參數(shù)校驗(yàn)方式
- 使用BindingResult 自定義錯(cuò)誤信息
- 使用注解@Validated和BindingResult對(duì)入?yún)⑦M(jìn)行非空校驗(yàn)方式
- @Valid 校驗(yàn)無(wú)效,BindingResult未獲得錯(cuò)誤的解決
- 使用@Validated 和 BindingResult 遇到的坑及解決
相關(guān)文章
Java接口操作(繼承父類(lèi)并實(shí)現(xiàn)多個(gè)接口)
這篇文章主要介紹了Java接口操作(繼承父類(lèi)并實(shí)現(xiàn)多個(gè)接口),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Netty實(shí)戰(zhàn)入門(mén)教程之?什么是Netty
Java中支持三種網(wǎng)絡(luò)編程IO模型,BIO、NIO、AIO,Netty對(duì)NIO又做了一層封裝,本文帶領(lǐng)我們了解Netty到底是什么,Netty入門(mén)案例,感興趣的朋友跟隨小編一起看看吧2022-02-02
Java Spring中Quartz調(diào)度器詳解及實(shí)例
這篇文章主要介紹了Java Spring中Quartz調(diào)度器詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
SpringBoot整合Elasticsearch7.2.0的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot整合Elasticsearch7.2.0的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Java字符串?dāng)?shù)組的創(chuàng)建代碼示例
這篇文章主要介紹了Java中字符串?dāng)?shù)組的聲明、初始化、默認(rèn)值、遍歷和常見(jiàn)操作,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-03-03
Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程
Geotools作為一款功能強(qiáng)大且開(kāi)源的地理工具庫(kù),為地理數(shù)據(jù)的處理和分析提供了豐富的類(lèi)庫(kù)和便捷的接口,能夠很好地滿足從DEM數(shù)據(jù)中讀取高程信息這一實(shí)戰(zhàn)需求,本文將深入講解如何利用Geotools從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過(guò)程,需要的朋友可以參考下2025-03-03

