手动 JSR 303 校验工具类

package com.tellhow.fztb.common.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import java.util.Set;

/**
 * 数据校验相关相关工具
 *
 * @author seliote
 * @since 2020/1/17
 */
@SuppressWarnings("unused")
@Component
public class ValidationUtil {

    private static Validator sValidator;

    // 注入校验器并转为 static 域
    @Autowired
    public ValidationUtil(Validator validator) {
        sValidator = validator;
    }

    /**
     * 获取数据 JSR 303 校验结果集合
     *
     * @param pojo 需要校验的数据,不可为 null
     * @param <T>  数据类型
     * @return 校验结果集合
     */
    public static <T> Set<ConstraintViolation<T>> getConstraintViolation(T pojo) {
        // 参数是 null 直接校验会导致 IllegalArgumentException: HV000116
        return sValidator.validate(pojo);
    }

    /**
     * 获取数据 JSR 303 校验结果字符串描述
     *
     * @param pojo 需要校验的数据,不可为 null
     * @param <T>  数据类型
     * @return 校验正确时返回 null,失败时返回对应校验结果字符串描述
     */
    public static <T> String getValidationMsg(T pojo) {
        // 两个校验结果之间的分隔符
        final String separator = ", ";
        StringBuilder stringBuilder = new StringBuilder();
        // 生成字符串
        for (ConstraintViolation<T> violation : getConstraintViolation(pojo)) {
            // 没有类限定,直接返回域名
            stringBuilder.append(violation.getPropertyPath().toString())
                    .append(": ")
                    .append(violation.getMessage())
                    .append(separator);
        }
        // 参数校验正确返回 null
        if (stringBuilder.length() <= 0) {
            return null;
        } else {
            // 删掉末尾的
            int length = stringBuilder.length();
            stringBuilder.delete(length - separator.length(), length);
        }
        return stringBuilder.toString();
    }

    /**
     * 校验数据是否符合 JSR 303 规范
     *
     * @param pojo 需要校验的数据,不可为 null
     * @param <T>  数据类型
     * @return 符合返回 true, 否则返回 false
     */
    public static <T> boolean isLegal(T pojo) {
        return getConstraintViolation(pojo).size() <= 0;
    }
}
原文地址:https://www.cnblogs.com/seliote/p/12205845.html