首页 > 解决方案 > 验证 Java POJO 中的字段值

问题描述

用例:

假设这是我的 POJO:

class Sample{
    
    String field1;

    String field2;

    double field3;

    LocalDateTime field4;

    LocalDateTime field5;

    //...getters, setters and parameterised constructor
}

我正在从外部文件中读取某些值并使用参数化构造函数创建 POJO。所有字段都有一定的验证约束。

我正在寻找的是一种在我使用参数化构造函数创建对象时自动评估这些约束的方法。如果一个或多个验证约束失败,它应该抛出一个错误。

到目前为止我已经尝试过:

我通过创建自己的注释和验证器在 Spring 中尝试了 Bean Validation 方法。代码如下:

POJO

@ValidChecker(groups = Default.class)
class Sample{
    
    String field1;

    String field2;

    double field3;

    LocalDateTime field4;

    LocalDateTime field5;

    //...getters, setters and parameterised constructor
}

ValidChecker 注解

@Constraint(validatedBy = DataValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidChecker {

    String message() default "Data is not valid";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

数据验证器.java

@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
public class DataValidator implements ConstraintValidator<ValidChecker, ValidationData> {

    @Override
    public void initialize(ValidChecker constraintAnnotation) {
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(ValidationData validationData, ConstraintValidatorContext constraintValidatorContext) {

        if (validationData == null) {
            return false;
        }

        if (BigDecimal.valueOf(validationData.getField3()).scale() != 2) {
            return false;
        }

        if (validationData.getField5().isBefore(validationData.getField4())) {
            return false;
        }

        return true;
    }
}

上面的代码不起作用。

需要的建议

  1. 上述方法的问题
  2. 使用 Spring 的替代方法
  3. 使用一些第三方库的替代方法

我看了很多,但找不到没有 Spring bean 验证的方法。有人可以帮忙吗?

标签: javaspring-bootvalidationjava-8pojo

解决方案


您可以直接在构造函数中使用 Bean Validation API:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Sample>> violations = validator.validate(this);
if (!violations.isEmpty()) {
    throw new ConstraintViolationException(violations);
}

推荐阅读