为什么使用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());
}
先进行校验信息的判断是否有错,然后通过自定义的业务异常返回到前端。