第十四篇: Spring Boot使用校驗框架validation校驗
一般用在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) | 被註釋的元素必須符合指定的正則表示式 |
註解 | 作用 |
---|---|
被註釋的元素必須是電子郵箱地址 | |
@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