验证 Java POJO 中的字段值

Validating field values in a Java POJO

用例:

假设这是我的 POJO:

class Sample{
    
    String field1;

    String field2;

    double field3;

    LocalDateTime field4;

    LocalDateTime field5;

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

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

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

目前我尝试过的:

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

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 {};
}

DataValidator.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. 的替代方法
  4. 使用某些第三方库的替代方法

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

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

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