简介
使用hibernate-validate来验证,其中分为手动和自动校验,自动校验可以联合spring,使用@Valid注解,以及 BindingResult类来自动收集消息。 本博客实现的功能是创建一个数据校验的工具类:校验指定类或注定属性是否符合规则,将错误封装。以后可以通过手动调用校验返回结果
具体实现
依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.0.Final</version>
</dependency>
封装异常信息的实体类
@Getter
@Setter
@ToString
public class ValidateResult {
/**
* 是否有异常
*/
private boolean hasErrors;
/**
* 异常消息记录
*/
private Map<String, String> errorMsg;
}
第三步:数据校验工具类
public class ValidateUtil {
private ValidateUtil() {
}
/**
* 验证器
*/
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 校验实体,返回实体所有属性的校验结果
* @param obj
* @param <T>
* @return
*/
public static <T> ValidateResult validateEntity(T obj) {
Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
return buildValidationResult(set);
}
/**
* 校验指定实体的指定属性是否存在异常
*
* @param obj
* @param propertyName
* @param <T>
* @return
*/
public static <T> ValidateResult validateProperty(T obj, String propertyName) {
Set<ConstraintViolation<T>> set = validator.validateProperty(obj, propertyName, Default.class);
return buildValidationResult(set);
}
/**
* 将异常结果封装返回
*
* @param set
* @param <T>
* @return
*/
private static <T> ValidateResult buildValidationResult(Set<ConstraintViolation<T>> set) {
ValidateResult result = new ValidateResult();
if (!CollectionUtils.isEmpty(set)) {
result.setHasErrors(true);
Map<String, String> errorMsg = new HashMap<>();
for (ConstraintViolation<T> cv : set) {
errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());
}
result.setErrorMsg(errorMsg);
}
return result;
}
}
测试代码
public class ValidateUtilsTest {
@Test
public void validateEntity() {
UserLoginDTO user = new UserLoginDTO();
ValidateResult result = ValidateUtil.validateEntity(user);
System.out.println(result);
}
@Test
public void validateEntity2() {
UserLoginDTO user = new UserLoginDTO();
user.setAccount("asdfweeqreq");
ValidateResult result = ValidateUtil.validateEntity(user);
System.out.println(result);
}
@Test
public void validateEntity3() {
UserLoginDTO user = new UserLoginDTO();
user.setAccount("asdfweeqreq");
user.setPassword("23154323424");
ValidateResult result = ValidateUtil.validateEntity(user);
System.out.println(result);
}
@Test
public void validateProperty() {
UserLoginDTO user = new UserLoginDTO();
ValidateResult result = ValidateUtil.validateProperty(user,"account");
System.out.println(result);
}
}