Hibernate验证工具类


import org.springframework.util.CollectionUtils;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @program: 参数检验工具
 * @description: hibernate validator手动验证工具类,效果相当于springMVC中的@valid,此工具为手动验证工具类
 * @author: moodincode
 * @create: 2020/12/25
 **/
public final class HibernateValidationUtil {
	/**
	 * 调用hibernate validator进行对象字段规则验证
	 */
	private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

	private HibernateValidationUtil() {

	}

	/**
	 * 验证对象
	 * @param obj
	 * @param <T>
	 * @return
	 */
	public static <T> ValidationResult validateEntity(T obj) {
		if (obj == null) {
			Map<String, String> errorMsg = new HashMap<>(1);
			errorMsg.put("验证对象", "不能为空");
			return new ValidationResult(true, errorMsg, "验证对象不能为空");
		}
		return handlerValidResult(validator.validate(obj, Default.class), null);
	}

	/**
	 * 验证对象某个属性名
	 * @param obj
	 * @param propertyName 属性名,如果是字段中对象里面的字段,则需要对象字段名.对象对应的字段,例如 soreInfo.english
	 * @param <T>
	 * @return
	 */
	public static <T> ValidationResult validateProperty(T obj, String propertyName) {
		if (obj == null) {
			Map<String, String> errorMsg = new HashMap<>(1);
			errorMsg.put("验证对象", "不能为空");
			return new ValidationResult(true, errorMsg, "验证对象不能为空");
		}
		return handlerValidResult(validator.validateProperty(obj, propertyName, Default.class), propertyName);
	}

	public static <T> ValidationResult handlerValidResult(Set<ConstraintViolation<T>> resultSet, String propertyName) {
		ValidationResult result = new ValidationResult();
		if (!CollectionUtils.isEmpty(resultSet)) {
			result.setHasErrors(true);
			Map<String, String> errorMsg = new HashMap<>(16);
			boolean isNotAddToFirst = true;
			for (ConstraintViolation<T> cv : resultSet) {
				if (isNotAddToFirst) {
					if (cv.getMessageTemplate().equals(cv.getMessage())) {
						result.setFirstErrorMsg(cv.getMessage());
					} else {
						result.setFirstErrorMsg((propertyName == null ? cv.getPropertyPath().toString() : propertyName)
								+ cv.getMessage());
					}
					isNotAddToFirst = false;

				}
				errorMsg.put(propertyName == null ? cv.getPropertyPath().toString() : propertyName, cv.getMessage());
			}
			result.setErrorMsg(errorMsg);
		} else {
			result.setHasErrors(false);
		}
		return result;
	}

	public static Validator getValidator() {
		return validator;
	}

	public static void setValidator(Validator validator) {
		HibernateValidationUtil.validator = validator;
	}

	public static class ValidationResult {
		/**
		 * 是否有错误
		 */
		private Boolean hasErrors;
		/**
		 * 错误信息集合
		 */
		private Map<String, String> errorMsg;
		/**
		 * 第一条触发错误的信息
		 */
		private String firstErrorMsg;

		public ValidationResult() {
		}

		public ValidationResult(Boolean hasErrors, Map<String, String> errorMsg, String firstErrorMsg) {
			this.hasErrors = hasErrors;
			this.errorMsg = errorMsg;
			this.firstErrorMsg = firstErrorMsg;
		}

		public Boolean getHasErrors() {
			return hasErrors;
		}

		public void setHasErrors(Boolean hasErrors) {
			this.hasErrors = hasErrors;
		}

		public Map<String, String> getErrorMsg() {
			return errorMsg;
		}

		public void setErrorMsg(Map<String, String> errorMsg) {
			this.errorMsg = errorMsg;
		}

		public String getFirstErrorMsg() {
			return firstErrorMsg;
		}

		public void setFirstErrorMsg(String firstErrorMsg) {
			this.firstErrorMsg = firstErrorMsg;
		}
	}

}

需要引用hibernate-validator依赖,配合hibernate的注解进行校验,主要用于不依赖直接抛出异常的场景,或者自定义抛出异常的场景,例如根据不同业务类型,将json字符串转对象后,校验数据是否正常,或者读取excel数据后,校验格式等场景


版权声明:本文为qq_24577585原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。