1. 程式人生 > >Springboot 使用BindingResult校驗引數

Springboot 使用BindingResult校驗引數

1、建立一個引數物件

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="密碼的長度應該在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控制層寫引數接收的入口,需要注意的是@Valid 和 BindingResult 是一 一對應的,如果有多個@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、傳入引數和控制檯列印結果如下圖所示:

log日誌編碼集沒有修改所以是亂碼,返回結果我並沒有返回錯誤資訊,在此只是在控制檯打印出來,實際情況再根據實際需要返回給前臺呈現

4、常用校驗註解

@Null 只能是null @NotNull 不能為null 注意用在基本型別上無效,基本型別有預設初始值 @AssertFalse 必須為false @AssertTrue 必須是true 字串/陣列/集合檢查:(字串本身就是個陣列) @Pattern(regexp="reg") 驗證字串滿足正則 @Size(max, min) 驗證字串、陣列、集合長度範圍 @NotEmpty 驗證字串不為空或者null @NotBlank 驗證字串不為null或者trim()後不為空 數值檢查:同時能驗證一個字串是否是滿足限制的數字的字串 @Max 規定值得上限int @Min 規定值得下限 @DecimalMax("10.8") 以傳入字串構建一個BigDecimal,規定值要小於這個值  @DecimalMin 可以用來限制浮點數大小 @Digits(int1, int2) 限制一個小數,整數精度小於int1;小數部分精度小於int2 @Digits 無引數,驗證字串是否合法 @Range(min=long1,max=long2) 檢查數字是否在範圍之間 這些都包括邊界值

日期檢查:Date/Calendar @Post 限定一個日期,日期必須是過去的日期 @Future 限定一個日期,日期必須是未來的日期 其他驗證: @Vaild 遞迴驗證,用於物件、陣列和集合,會對物件的元素、陣列的元素進行一一校驗 @Email 用於驗證一個字串是否是一個合法的右鍵地址,空字串或null算驗證通過 @URL(protocol=,host=,port=,regexp=,flags=) 用於校驗一個字串是否是合法UR