利用Validator校验对象参数

17 阅读1分钟
/**
     * 校验核心入参是否为空
     * 存在额外参数需在实体类添加@JsonIgnoreProperties(ignoreUnknown = true)注解
     *
     * @param clazz
     * @param <T>
     * @return
     */
public static <T> String ValidHxzgResponse(T clazz) {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Set<ConstraintViolation<T>> violations = validator.validate(clazz);
        StringBuilder stringBuilder = new StringBuilder();
        if (!violations.isEmpty()) {
            violations.forEach(violation -> stringBuilder.append(violation.getMessage()).append(","));
        }
        return stringBuilder.toString();
    }

Jakarta Bean Validation 一些核心 API,如下:

Validator,用于校验常规 Java Bean,同时支持分组校验;分组校验有时候很有必要,比如用户名在创建时不允许为空,但在更新时用户名可以为空。

ExecutableValidator,用于校验方法参数与方法返回值,同样支持分组校验。方法参数和方法返回值往往并不是一个常规 Java Bean,可能是一种容器,比如:List、Map 和 Optional 等;Java 8 针对ElementType新增了一个 TYPE_USE 枚举实例,这让容器元素 (container elements) 的校验变得简单,Jakarta Bean Validation API 中内置的注解式约束的头上均有 TYPE_USE 的身影。

ConstraintValidator,如果 Jakarta Bean Validation API 中内置的注解式约束不能满足实际的需求,则需要自定义注解式约束,同时还需要为自定义约束指定校验器,这个校验器需要实现 ConstraintValidator 接口。

ValueExtractor,容器并不仅仅指的是 JDK 类库中的 List、Map 和 Set 等,也可以是一些包装类,比如ResponseEntity;如果要想校验 ResponseEntity 容器中的 body,那么就需要通过实现 ValueExtractor 接口来自定义一个容器元素抽取器,然后通过Configuration的addValueExtractor()方法注册自定义 ValueExtractor。