spring - Bean 验证 - 验证可选字段
问题描述
给定一个表示从表单提交的有效负载的类,我想将 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" )
);
}
您可以看到,在第一种情况下,您没有遇到任何违规行为,因为可选字段是null
. 但是在第二个示例中,您会收到违反模式约束的行为,因为aaa
它不是一串数字。
推荐阅读
- apache-spark - 将 udf 函数更改为 spark sql 函数
- python - 训练时使用 BERT 模型进行文本情感分析时出错
- r - 如何在 geom_smooth() 中强制执行公共斜率?
- r - 错误:Quosures 只能在 quasiquotation 上下文中不被引用
- python - 如何在python电子邮件中的列表中换行
- ansible - 提示将 CSR 复制到本地文件夹 IFF 一个是在 ansible 中生成的吗?
- java - 访问在 TimerTask() 中修改的全局类变量
- apache-kafka - 没有 Sink 的 Kafka 流
- operating-system - 页表条目的大小
- python - 同时根据键和值对字典进行排序