【问题标题】:Bean validation - validate optional fieldsBean 验证 - 验证可选字段
【发布时间】:2019-09-18 08:21:30
【问题描述】:

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

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

    ...
} 

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

谢谢。

【问题讨论】:

    标签: spring spring-boot bean-validation


    【解决方案1】:

    所以通常所有这些约束都认为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 不是一串数字。

    【讨论】:

    • @Mister_L 这是否说明了答案?我已经为您编辑并添加了一个示例
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多