引言:在常見的工程中,一般是在Controller中校驗入參,校驗入參的方式有多種,這里介紹的使用hibernate-validate來驗證,其中分為手動和自動校驗,自動校驗可以聯合spring,使用@Valid注解,以及 BindingResult類來自動收集消息,這里介紹的如何自動的,隨時隨地的調用工具類,校驗指定類或注定屬性是否符合規則,將錯誤封裝。
1. 添加 hibernate-validate依賴
<!--hibernate validate--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.16.Final</version> </dependency>
2. 接收處理結果,以及輸出格式化的一個實體類
package com.stylefeng.guns.core.util; import org.apache.commons.lang3.StringUtils; import java.text.MessageFormat; import java.util.Map; /** * @author ztkj-hzb * @Date 2019/8/28 11:26 * @Description 實體校驗結果 */ public class ValidationResult { /** * 是否有異常 */ private boolean hasErrors; /** * 異常消息記錄 */ private Map<String, String> errorMsg; /** * 獲取異常消息組裝 * * @return */ public String getMessage() { if (errorMsg == null || errorMsg.isEmpty()) { return StringUtils.EMPTY; } StringBuilder message = new StringBuilder(); errorMsg.forEach((key, value) -> { message.append(MessageFormat.format("{0}:{1} \r\n", key, value)); }); return message.toString(); } public boolean isHasErrors() { 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; } @Override public String toString() { return "ValidationResult{" + "hasErrors=" + hasErrors + ", errorMsg=" + errorMsg + '}'; } }
3. 創建工具類,提供公共方法校驗,返回結果
package com.stylefeng.guns.core.util; import org.apache.commons.collections.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; /** * @author ztkj-hzb * @Date 2019/8/28 11:21 * @Description 實體校驗工具類 */ public class ValidateUtil { private ValidateUtil() { } /** * 驗證器 */ private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); /** * 校驗實體,返回實體所有屬性的校驗結果 * * @param obj * @param <T> * @return */ public static <T> ValidationResult validateEntity(T obj) { //解析校驗結果 Set<ConstraintViolation<T>> validateSet = validator.validate(obj, Default.class); return buildValidationResult(validateSet); } /** * 校驗指定實體的指定屬性是否存在異常 * * @param obj * @param propertyName * @param <T> * @return */ public static <T> ValidationResult validateProperty(T obj, String propertyName) { Set<ConstraintViolation<T>> validateSet = validator.validateProperty(obj, propertyName, Default.class); return buildValidationResult(validateSet); } /** * 將異常結果封裝返回 * * @param validateSet * @param <T> * @return */ private static <T> ValidationResult buildValidationResult(Set<ConstraintViolation<T>> validateSet) { ValidationResult validationResult = new ValidationResult(); if (CollectionUtils.isNotEmpty(validateSet)) { validationResult.setHasErrors(true); Map<String, String> errorMsgMap = new HashMap<>(); for (ConstraintViolation<T> constraintViolation : validateSet) { errorMsgMap.put(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage()); } validationResult.setErrorMsg(errorMsgMap); } return validationResult; } }