格式化校驗規則
實現前在pom檔案中引入Apache Commons Lang包,使用了其StringUtils工具類;再引入hibernate-validator包來進行校驗。
首先,建立一個檢驗結果類ValidationResult,我們可以在應用程式和我們的Validator校驗邏輯之間通過這個ValidationResult去做對應的對接。再建立校驗實現類ValidatorImpl,它實現InitializingBean,以實現afterPropertiesSet的方式,即當Spring的Bean初始化完成之後,會回撥對應這個ValidatorImpl的實現afterPropertiesSet的方式。因為我們需要包裝出Validator(javax.validation.Validator)類(通過javax定義的一套介面Validator是實現Validator的工具),在afterPropertiesSet中,將hibernate validator 通過工廠校驗的方式使其例項化,實現javax.validation.Validator介面的校驗器,有了這個校驗器可以去實現校驗方法並返回校驗結果。
對欄位有什麼限制可在model層下物件模型的欄位上新增註解如@NotBlank、@NotNull、@Max、@Min等。
上程式碼:
package com.miaosha.validator;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class ValidationResult {
//檢驗校驗結果是否有錯
private boolean hasErrors = false;
//存放錯誤資訊的map
private Map<String,String> errMsgMap = new HashMap<>();
public boolean isHasErrors() {
return hasErrors;
}
public void setHasErrors(boolean hasErrors) {
this.hasErrors = hasErrors;
}
public Map<String, String> getErrMsgMap() {
return errMsgMap;
}
public void setErrMsgMap(Map<String, String> errMsgMap) {
this.errMsgMap = errMsgMap;
}
//實現通用的通過格式化字串資訊獲取錯誤結果的msg方法
public String getErrMsg(){
return StringUtils.join(errMsgMap.values().toArray(),",");
}
}
複製程式碼
package com.miaosha.validator;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
@Component//使其為spring的一個bean,進行類掃描的時候能夠掃描到它
public class ValidatorImpl implements InitializingBean {
private Validator validator;
//實現校驗方法並返回校驗結果
public ValidationResult validate(Object bean){
final ValidationResult result = new ValidationResult();
Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(bean);//若對應bean裡邊的一些引數的規則違背了對應Validation定義的Annotation(註釋),這個set中就會有值
if (constraintViolationSet.size()>0){
//有錯誤
result.setHasErrors(true);
constraintViolationSet.forEach(constraintViolation->{
String errMsg = constraintViolation.getMessage();
String propertyName = constraintViolation.getPropertyPath().toString();
result.getErrMsgMap().put(propertyName,errMsg);
});
}
return result;
}
@Override
public void afterPropertiesSet() throws Exception {
//將hibernate validator 通過工廠校驗的方式使其例項化
this.validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}
複製程式碼
在model層下物件模型的欄位上新增註解如@NotBlank、@NotNull、@Max、@Min等註釋,校驗規則使用例:
//優化校驗
ValidationResult result = validator.validate(userModel);
if (result.isHasErrors()){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
}
//原先校驗方法
if (StringUtils.isEmpty(userModel.getName())
||userModel.getGender()==null
||userModel.getAge()==null
||StringUtils.isEmpty(userModel.getTelphone())){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
}
複製程式碼
參考:
推薦剛入手SpringBoot的同學觀看,老師基礎講的特別好