Spring Bean验证-验证可选字段

Spring Bean验证-验证可选字段,spring,spring-boot,bean-validation,Spring,Spring Boot,Bean Validation,给定一个表示从表单提交的有效负载的类,我想将bean验证应用于可能存在或不存在的字段,例如: class FormData { @Pattern(...) @Size(...) @Whatever(...) private String optionalField; ... } 如果有效负载中未发送optionalField,我不想应用上述任何验证器,但如果发送了,我想应用所有验证器。怎样才能做到呢 谢谢代码>值为有效。如果您的可选字段为null,但

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

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

    ...
} 
如果有效负载中未发送
optionalField
,我不想应用上述任何验证器,但如果发送了,我想应用所有验证器。怎样才能做到呢


谢谢 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" )
    );
}
类FormData{
@模式(regexp=“\\d+”)
@尺寸(最小值=3,最大值=3)
私有最终字符串可选字段;
@模式(regexp=“[a-z]+”)
@尺寸(最小值=3,最大值=3)
@NotNull
私有最终字符串mandatoryField;
}
@试验
公开无效测试(){
Validator Validator=getValidator();
//视场为空,因此不会出现违规情况
FormData数据=新FormData(空,“abc”);
设置冲突=validator.validate(数据);
断言(违反).isEmpty();
//存在可选字段,但模式验证应失败:
数据=新表格数据(“aaa”、“abc”);
违规=验证程序。验证(数据);
资产(违规)。仅包含违规(
违反(Pattern.class).withProperty(“optionalField”)
);
}

您可以看到,在第一种情况下,由于可选字段为
null
,因此不会出现任何冲突。但是在第二个exmaple中,您收到了一个违反模式约束的消息,因为
aaa
不是一个数字字符串

@Mister_L这是否澄清了答案?我已经为您编辑并添加了一个示例