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