【问题标题】:Bean validation specification prioritizingBean 验证规范优先级
【发布时间】:2017-05-26 13:56:42
【问题描述】:

我正在使用 bean 验证规范来验证我在 spring-boot thymeleaf 项目中的表单。 我的实体属性如下。

@NotEmpty(message = "{Password should not be empty}")
@Pattern(regexp = //Pattern for range 1-20, message = "{Wrong Input}")
private String            password;

当我以空值运行并输入表单的密码字段时,会显示两个验证错误消息。

我的期望是,当输入空值时,只有@NotEmpty 注释应该起作用,另一方面,用户输入时应该只显示@Pattern 是错误的。

我该如何使用 Bean 验证规范呢?

问候。

【问题讨论】:

  • 你能说明你在@Pattern 中使用的正则表达式模式吗?
  • @Gaurav 我在源代码中使用的实际模式是 (?=.*[0-9])(?=.*[az])(?=.*[ AZ])(?=\\S+$).{8,20}
  • 你能给出一个你希望通过这个正则表达式的示例字符串吗?
  • 这是示例字符串 test123User

标签: java spring spring-boot thymeleaf bean-validation


【解决方案1】:

1。 Validation groups

@NotEmpty(groups = First.class), message = ...,          
@Pattern(groups = Second.class, regexp = ...)
private String password;

创建验证组:

//Validation Groups - Just empty interface used as Group identifier
public interface First {
}
public interface Second {
}

并以这种方式验证模型:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Model>> violations = validator.validate(model, First.class);

if(violations.isEmpty()){
     violations = validator.validate(model, Second.class);
}

2。 Groups Sequences

我从未使用过它们,但它似乎可以满足您的需求

检查这个其他答案 (https://stackoverflow.com/a/7779681/641627)。我在下面添加了这个答案的引用(来自 @Gunnar),具有讽刺意味的是,它还使用了 FirstSecond 组名:

@GroupSequence({First.class, Second.class})
public interface Sequence {}

@Size(min = 2, max = 10, message = "Name length improper", groups = { First.class })
@Pattern(regexp = "T.*", message = "Name doesn't start with T" , groups = { Second.class })
private String name;

现在使用定义的序列验证 Bean 实例时 (validator.validate(bean, Sequence.class)),首先是@Size 约束将被验证,并且只有当 @Pattern 成功时 约束。

使用此解决方案,您无需手动调用 validator.validate(...),验证将按照序列中定义的顺序执行,如果失败则短路。

【讨论】:

  • 对不起,我无法理解 First.class 和 Second.class 的含义。它们究竟是什么?
  • 我已经用第一和第二定义编辑了第 (1) 部分。它们只是您需要创建的空接口,只是为了将它们用作组标识符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多