spring - Bean 验证 - 验证可选字段

标签 spring spring-boot bean-validation

给定一个表示从表单提交的有效负载的类,我想将 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 不是数字字符串。

关于spring - Bean 验证 - 验证可选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988177/

相关文章:

java - 带有需要枚举参数的注释的 clojure gen-class

java - 如何在 Spring Boot 中处理两个模型之间的多对多关系并围绕它们设计剩余调用?

java - 长时间发送请求时出现 org.springframework.transaction.CannotCreateTransactionException

java - 使用 Java Bean Validation 验证字符串数组的元素

java - 如何在 Spring MVC Controller 中将表单数据作为 map 获取?

java - Maven spring-boot-starter-security 将 org.springframework.security 限制为版本 3.2.8 并且不使用 4.0.2

java - 使用方法调用切入点在 Spring 中进行 AspectJ 加载时编织?

spring boot MVC 错误编码的 POST 请求

java - BeanValidation : Messages from ValidationMessages. 属性

java - 从另一个类的静态方法初始化 Spring bean?