- 在实际的开发中,当进行向数据库中插入或更新数据的操作的时候,常常会需要对数据是否合法进行必要的判断,例如判断一个电话号码格式是否合法,身份证号码是否合法,邮箱地址是否合法等等.
- 如果这些操作都需要用java代码一个一个进行判断的话,不仅代码重复率特别高,而且也容易出错.因此,如果有一个简单可复用的方式来进行这些操作,那么会使程序变得更加完美.
- java中自带了一套参数检验的api,但是随着java周边环境的不断更新迭代,出现了许多相比较java更加严谨的产品.
- hibernate-validator- 就是一个基于java底层实现的一套参数校验工具,使用起来也非常简单.以下是我在学习中对hibernate-validator工具的简单应用,分享出来供大家学习参考,也希望大家指出我的不足之处.
hibernate-validator简单封装应用
- 如果是maven工程,添加以下的依赖即可导入hibernate-validator的jar包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
- 定义一个校验结果类,用于保存每次参数校验结果,与对应的错的参数名与错误提示信息
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class ValidationResult {
private boolean hasErrors = false;
private Map<String,String> errorMsgMap = new HashMap<>();
public boolean isHasErrors() {
return hasErrors;
}
public void setHasErrors(boolean hasErrors) {
this.hasErrors = hasErrors;
}
public Map<String, String> getErrorMsgMap() {
return errorMsgMap;
}
public void setErrorMsgMap(Map<String, String> errorMsgMap) {
this.errorMsgMap = errorMsgMap;
}
public String getErrMsg(){
return StringUtils.join(errorMsgMap.values().toArray(),",");
}
}
- 定义一个工具类,实现校验方法并返回校验结果,该类通过继承 InitializingBean接口覆写 afterPropertiesSet()方法来进行参数校验器初始化.
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
public class ValidatorImpl implements InitializingBean {
private Validator validator;
public ValidationResult validate(Object object){
final ValidationResult result = new ValidationResult();
Set<ConstraintViolation<Object>> validate = validator.validate(object);
if (validate.size() > 0){
result.setHasErrors(true);
validate.forEach(item->{
String errMsg = item.getMessage();
String fieldName = item.getPropertyPath().toString();
result.getErrorMsgMap().put(fieldName,errMsg);
});
}
return result;
}
@Override
public void afterPropertiesSet() throws Exception {
this.validator = Validation.buildDefaultValidatorFactory().getValidator();
}
}
- 就此功能代码实现完成,然后在需要使用参数校验的java类中使用 校验的注解来定义校验规则与错误提示信息
public class UserModel {
private Integer id;
@NotBlank(message = "用户名不能为空")
private String name;
@NotNull(message = "性别不能不填写")
private Byte gender;
@NotNull(message = "年龄不能不填写")
@Min(value = 0,message = "年龄不能为负数")
private Integer age;
@NotBlank(message = "手机号不能为空")
private String telphone;
private String registerMode;
private String thirdPartyId;
@NotBlank(message = "密码不能为空")
private String encrptPassword;
}
- 然后在需要进行校验的代码逻辑中通过spring @Autowrite 自动注入校验工具类
- 调用校验方法返回校验结果,通过校验结果中的isHasErrors()方法判断是否有错误,如果有错误,通过校验结果的getErrMsg()方法获取错误提示信息
- 之后可以自己决定是要终止程序还是进行其他操作这就随意了