java開發validate方法中校驗工具類詳解

validate方法中校驗工具類

日常Java開發中,我們使用validate的校驗是很方便的,但是也有一些特殊情況需要單獨處理,

例如:導入Excel校驗,傳入的是MultipartFile文件類型,我們不能使用註解進行校驗實體信息,隻能通過先解析成實體類然後進行校驗,此時已經到瞭方法裡面,不能使用校驗註解來處理瞭,我們應該如何處理這類情況呢?

一般情況下,我們校驗用的@Validated或者@Valid註解是直接在controller中添加,
然後全局異常處理 @RestControllerAdvice 中 進行攔截處理並返回所需校驗提示信息。

但是,如果在方法Service中如何使用validate方法校驗呢,加註解是不能生效的,因為源碼沒有直接這樣處理。

不過,我們可以使用源碼提供的ValidatorFactory工廠的Validator校驗器的validate方法。

import lombok.experimental.UtilityClass;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.List;
import java.util.Set;
/**
 * validate方法中校驗工具類
 * <p>
 * 隻要在實體中加上相應的validate的相關註解即可
 * </p>
 *
 * @author Zed
 */
@UtilityClass
public class ValidateTools {
    /**
     * 初始化檢查器
     */
    private static final ValidatorFactory VALIDATOR_FACTORY = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory();
    private static final Validator VALIDATOR = VALIDATOR_FACTORY.getValidator();
    /**
     * 校驗返回異常信息
     *
     * @param t   實體
     * @param <T> 實體泛型
     */
    public static <T> String validStr(T t) {
        // 構造返回信息
        StringBuilder validMessage = new StringBuilder();
        // 檢查實體T
        Set<ConstraintViolation<T>> set = VALIDATOR.validate(t);
        // 循環set,獲取檢查結果
        for (ConstraintViolation<T> vo : set) {
            validMessage.append(vo.getMessage()).append(";");
        }
        return validMessage.toString();
    }
    /**
     * 校驗實體拋出異常
     *
     * @param t   實體
     * @param <T> 實體泛型
     */
    public static <T> void valid(T t) {
        String validStr = validStr(t);
        // 拋出業務異常
        if (StringUtils.isNotBlank(validStr)) {
            throw new BusinessException(validStr);
        }
    }
    /**
     * 校驗集合拋出異常
     *
     * @param list 列表
     * @param <T>  實體泛型
     */
    public static <T> void valid(List<T> list) {
        if (CollectionUtils.isEmpty(list)) {
            throw new BusinessException("數據不存在!");
        }
        // 構造返回信息
        StringBuilder validMessageTotal = new StringBuilder();
        // 遍歷
        for (int i = 0; i < list.size(); i++) {
            String validStr = validStr(list.get(i));
            if (StringUtils.isNotBlank(validStr)) {
                String msg = String.format("第%d條數據校驗結果:[%s]\n", i + 1, validStr);
                validMessageTotal.append(msg);
            }
        }
        // 拋出業務異常
        if (StringUtils.isNotBlank(validMessageTotal.toString())) {
            throw new BusinessException(validMessageTotal.toString());
        }
    }
}

BusinessException是自己定義的業務異常類,然後在全局異常處理中增加這個異常攔截就行瞭。

僅供參考,實際開發請仔細測試找出合適的解決辦法。

以上就是java開發validate方法中校驗工具類詳解的詳細內容,更多關於java validate方法校驗的資料請關註WalkonNet其它相關文章!

推薦閱讀: