Hibernate-validate工具類,手動調用校驗返回結果


  引言:在常見的工程中,一般是在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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM