首页 > 解决方案 > Bean 验证 - 验证可选字段

问题描述

给定一个表示从表单提交的有效负载的类,我想将 bean 验证应用于可能存在或不存在的字段,例如:

class FormData {
    @Pattern(...)
    @Size(...)
    @Whatever(...)
    private String optionalField;

    ...
} 

如果optionalField未在有效负载中发送,我不想应用上面的任何验证器,但如果它被发送,我想应用所有验证器。怎么做到呢?

谢谢。

标签: springspring-bootbean-validation

解决方案


所以通常所有这些约束都认为null值是有效的。如果您的可选文件null不是有效负载的一部分,那么所有文件都应该可以正常工作。

对于任何必填字段,您都可以添加@NotNull它们。

编辑 这里是一个例子:

class FormData {
    @Pattern(regexp = "\\d+")
    @Size(min = 3, max = 3)
    private final String optionalField;

    @Pattern(regexp = "[a-z]+")
    @Size(min = 3, max = 3)
    @NotNull
    private final String mandatoryField;
}

@Test
public void test() {
    Validator validator = getValidator();

    // optonal field is null so no violations will rise on it
    FormData data = new FormData( null, "abc" );
    Set<ConstraintViolation<FormData>> violations = validator.validate( data );
    assertThat( violations ).isEmpty();

    // optional field is present but it should fail the pattern validation:
    data = new FormData( "aaa", "abc" );
    violations = validator.validate( data );
    assertThat( violations ).containsOnlyViolations(
            violationOf( Pattern.class ).withProperty( "optionalField" )
    );
}

您可以看到,在第一种情况下,您没有遇到任何违规行为,因为可选字段是null. 但是在第二个示例中,您会收到违反模式约束的行为,因为aaa它不是一串数字。


推荐阅读