Bean 验证 API,可以动态指示验证器忽略 POJO 特定字段上的特定约束注释

问题描述 投票:0回答:2

我有一个 POJO,其中一些字段用

@NotEmpty
注释:

public class SampleFormInputDTO {

  @NotEmpty
  private String textarea;

  private int myInt = 0;

  @NotEmpty
  private String myText = "somevalue";

  public String getTextarea() {
    return textarea;
  }

  public void setTextarea(String textarea) {
    this.textarea = textarea;
  }
}

目的是检查字段以确保它们包含一个值,即不为空且不为空。

如果我使用无参数构造函数创建

SampleFormInputDTO
的实例,则字段
textarea
最初将为 null,因此应该并且确实会按预期失败验证。

SampleFormInputDTO sampleFormInputDTO = new SampleFormInputDTO();

ValidatorFactory validatorFactory =
    Validation.byDefaultProvider()
        .configure()
        .messageInterpolator(new ParameterMessageInterpolator())
        .buildValidatorFactory();

Validator validator = validatorFactory.getValidator(sampleFormInputDTO);

Set<ConstraintViolation<SampleFormInputDTO>> violationSet = validator.validate();

我想知道是否可以动态/以编程方式指示验证器实例不验证特定字段的特定约束注释?

假设我已确定,作为处理 REST API 调用的一部分,我希望

textarea
类型的字段
SampleFormInputDTO
动态允许空字符串,但仅限于该特定字段。不影响同一 POJO 中其他字段上可能存在的任何约束注释。

这可能吗?

java validation constraints bean-validation
2个回答
0
投票

您可能想看看验证组

public class SampleFormInputDTO {

  @NotEmpty(groups = Group1.class)
  private String textarea;

  private int myInt = 0;

  @NotEmpty
  private String myText = "somevalue";

  public String getTextarea() {
    return textarea;
  }

  public void setTextarea(String textarea) {
    this.textarea = textarea;
  }
}

然后您可以控制哪些约束包含在验证中,哪些不包含在验证中,例如:

validator.validate(sampleFormInputDTO);

只会检查

myText
属性,但随后会类似:

validator.validate(sampleFormInputDTO, Group1.class, Default.class);

将验证两者。


0
投票

因此,如果我理解正确,您的问题是您想要验证字段,但如果提交了空对象,您不希望通过异常, 您可以尝试两种方案,第一种是将验证放在 args 构造函数中,因此当使用无参数构造函数时不会发生验证,请检查此示例:

public class Employee {
...
  public Employee (@NotNull String name) { ... }

  public void setSalary(
      @NotNull
      @Digits(integer=6, fraction=2) BigDecimal salary,
      @NotNull
      @ValidCurrency
      String currencyType) {
    ...
  }
...
}

链接是这里

或者您可以构建自己的自定义验证: 检查这里

我也相信您可以使用正则表达式并提供适合您情况的模式 检查这个

© www.soinside.com 2019 - 2024. All rights reserved.