爲什麼使用Validator
當我們對前端的註冊信息進行一個驗證的時候,我們要在Service對每一個變量進行一次判斷,這樣太複雜了,那麼就需產生一種格式化的簡單的校驗方式了。
使用Validator可以通過簡單的配置將校驗信息返回。
Validator的使用
我們首先要定義一個校驗結果返回的類。這個類用來判斷信息是否有錯,並且將錯誤信息存儲到Map中。
省略setter getter 方法
/**
* 描述:校驗結果
* @author wangyu
* @date 2019/5/29
*/
public class ValidationResult {
//判斷校驗是否有錯
private boolean hasError = false;
//存放錯誤信息的map
private Map<String,String> errMsgMap = new HashMap<>();
//格式化字符串信息獲得錯誤結果的msg方法
public String getErrMsg(){
return StringUtils.join(errMsgMap.values().toArray(),",");
}
}
然後通過Spring的工廠對Valiator進行一個初始化。然後寫一個接收一個Object對象的方法用來對我們接受的對象進行校驗。並將錯誤信息保存到Map中。
**
* 描述:對 Validator 進行實例化配置
* @author wangyu
* @date 2019/5/29
*/
@Component
public class ValidatorImpl implements InitializingBean {
private Validator validator;
//實現校驗方法並返回結果
public ValidationResult validate(Object bean) {
ValidationResult validationResult = new ValidationResult();
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(bean);
if (constraintViolations.size() > 0) {
//有錯誤
validationResult.setHasError(true);
constraintViolations.forEach(constraintViolation -> {
String errMsg = constraintViolation.getMessage();
String propertyName = constraintViolation.getPropertyPath().toString();
validationResult.getErrMsgMap().put(propertyName,errMsg);
});
}
return validationResult;
}
@Override
public void afterPropertiesSet() throws Exception {
//使hibernate validator通過工廠初始化進行實例化
this.validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}
最後,將我們要校驗的對象的類進行校驗的註解綁定。
/**
* 描述:用戶Model層
* @author wangyu
* @date 2019/5/22
*/
public class UserModel {
private Integer id;
@NotBlank(message="用戶名不能爲空")
private String name;
@NotNull(message = "性別必須填寫")
private Byte gender;
@NotNull(message = "年齡必須填寫")
@Min(value = 0,message = "年齡必須大於0")
@Max(value = 150,message = "年齡必須小於150")
private Integer age;
@NotNull(message="手機號不能爲空")
private String telphone;
@NotBlank(message="密碼不能爲空")
private String encrptPassword;
}
我們使用的時候只需要調用Validator方法即可。
ValidationResult validationResult = validator.validate(userModel);
if (validationResult.isHasError()){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,validationResult.getErrMsg());
}
先進行校驗信息的判斷是否有錯,然後通過自定義的業務異常返回到前端。