1. 程式人生 > >第十四篇: Spring Boot使用校驗框架validation校驗

第十四篇: Spring Boot使用校驗框架validation校驗

Spring Boot在內部通過整合hibernate-validation已經實現了JSR-349驗證規範介面,在Spring Boot專案中只要直接使用就行了。
一般用在Controller中用於驗證前端傳來的引數。

驗證分兩種:對封裝的Bean進行驗證  或者  對方法簡單引數的驗證。

validation與 springboot 結合

1. bean 中新增標籤

部分程式碼: 
標籤需要加在屬性上,@NotBlank 標籤含義文章末尾有解釋

package com.example.validation.domain;

import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;

public class User {
	@NotBlank(message = "使用者名稱稱不能為空。")
	private String name;

	@Range(max = 150, min = 1, message = "年齡範圍應該在1-150內。")
	private Integer age;

	@NotEmpty(message = "密碼不能為空")
	@Length(min = 6, max = 8, message = "密碼長度為6-8位。")
	@Pattern(regexp = "[a-zA-Z]*", message = "密碼不合法")
	private String password;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

2. Controller中開啟驗證

在Controller 中 請求引數上新增@Validated 標籤開啟驗證


package com.example.validation.web;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import com.example.validation.domain.User;

@RestController
public class ValidatorController {

	private static final Logger log = LoggerFactory.getLogger(ValidatorController.class);

	/**
	 * 驗證框架使用測試
	 * 
	 * @param user
	 * @param result
	 */
	@PostMapping("v/t1.json")
	public void v1(@RequestBody @Validated User user, BindingResult result) {
		StringBuilder sBuilder = new StringBuilder();
		sBuilder.append("\n");
		if (result.hasErrors()) {
			List<ObjectError> list = result.getAllErrors();
			for (ObjectError error : list) {
				log.info(error.getCode() + "---" + error.getArguments() + "---" + error.getDefaultMessage());
				System.out.println(error.toString());
				sBuilder.append(error.getDefaultMessage());
				sBuilder.append("\n");
			}
		}
		log.info(sBuilder.toString());
	}
}

3. resource 下新建錯誤資訊配置檔案

在resource 目錄下新建提示資訊配置檔案“ValidationMessages.properties“

注意:名字必須為“ValidationMessages.properties“ 因為SpringBoot自動讀取classpath中的ValidationMessages.properties裡的錯誤資訊
  • 1
  • 2

ValidationMessages.properties 檔案的編碼為ASCII。資料型別為 key value 。key“user.name.notBlank“為第一步 bean的標籤 大括號裡面對應message的值

value 為提示資訊 ,但是是ASCII 。(內容為“名字不能為空“)

這裡寫圖片描述

4. 自定義異常處理器,捕獲錯誤資訊

當驗證不通過時會拋異常出來,異常的message 就是 ValidationMessages.properties 中配置的提示資訊。此處定義異常處理器。捕獲異常資訊(因為驗證不通過的項可能是多個所以統一捕獲處理),並拋給前端。(此處是前後端分離開發)

    public void MethodArgumentNotValidException(Exception ex, HttpServletRequest request, HttpServletResponse response) {
        logger.error( ":" + CommonUtil.getHttpClientInfo(request), ex);
        MethodArgumentNotValidException c = (MethodArgumentNotValidException) ex;
        List<ObjectError> errors =c.getBindingResult().getAllErrors();
        StringBuffer errorMsg=new StringBuffer();
        errors.stream().forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
        pouplateExceptionResponse(response, HttpStatus.INTERNAL_SERVER_ERROR, errorMsg.toString());
    }


 private void pouplateExceptionResponse(HttpServletResponse response, HttpStatus errorCode, String errorMessage) {
        try {
            response.sendError(errorCode.value(), errorMessage);
        } catch (IOException e) {
            logger.error("failed to populate response error", e);
        }
    }

5. 附上部分標籤含義

Bean Validation 中內建的 constraint

           註解                                      作用

@Valid被註釋的元素是一個物件,需要檢查此物件的所有欄位值
@Null被註釋的元素必須為 null
@NotNull被註釋的元素必須不為 null
@AssertTrue被註釋的元素必須為 true
@AssertFalse被註釋的元素必須為 false
@Min(value)被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@Max(value)被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@DecimalMin(value)被註釋的元素必須是一個數字,其值必須大於等於指定的最小值
@DecimalMax(value)被註釋的元素必須是一個數字,其值必須小於等於指定的最大值
@Size(max, min)被註釋的元素的大小必須在指定的範圍內
@Digits (integer, fraction)被註釋的元素必須是一個數字,其值必須在可接受的範圍內
@Past被註釋的元素必須是一個過去的日期
@Future被註釋的元素必須是一個將來的日期
@Pattern(value)被註釋的元素必須符合指定的正則表示式
Hibernate Validator 附加的 constraint

註解作用
@Email被註釋的元素必須是電子郵箱地址
@Length(min=, max=)被註釋的字串的大小必須在指定的範圍內
@NotEmpty被註釋的字串的必須非空
@Range(min=, max=)被註釋的元素必須在合適的範圍內
@NotBlank被註釋的字串的必須非空
@URL(protocol=,
host=,    port=, 
regexp=, flags=)
被註釋的字串必須是一個有效的url
@CreditCardNumber
被註釋的字串必須通過Luhn校驗演算法,
銀行卡,信用卡等號碼一般都用Luhn
計算合法性
@ScriptAssert
(lang=, script=, alias=)
要有Java Scripting API 即JSR 223 
("Scripting for the JavaTM Platform")的實現
@SafeHtml
(whitelistType=, 
additionalTags=)
classpath中要有jsoup包

hibernate補充的註解中,最後3個不常用,可忽略。

主要區分下@NotNull  @NotEmpty  @NotBlank 3個註解的區別:

@NotNull           任何物件的value不能為null

@NotEmpty       集合物件的元素不為0,即集合不為空,也可以用於字串不為null

@NotBlank        只能用於字串不為null,並且字串trim()以後length要大於0

hibernate註解詳細:http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/

原始碼下載地址:https://gitee.com/zhmal/spring-boot-samples/tree/master/spring-boot-sample-validation