Bean验证 - 在第一个错误时停止验证

时间:2013-03-13 22:41:33

标签: java bean-validation

我想知道在一个失败时是否可以停止执行其他验证器?

我有一些豆,注释如下

import org.hibernate.validator.constraints.*;

/*...*/

@NotBlank(message = SignupForm.NOT_BLANK_MESSAGE)
@Email(message = SignupForm.EMAIL_MESSAGE)
private String email;

@NotBlank(message = SignupForm.NOT_BLANK_MESSAGE)
@Length(min = 6, message = SignupForm.PASSWORD_LENGTH_TOO_SHORT_MESSAGE)
private String password;

和我的JSP

<form:label path="email"><s:message code="email" /></form:label>
<form:errors path="email" element="div" class="text-error"/>
<form:input path="email" class="input-block-level" placeholder="Email address" />

<form:label path="email2"><s:message code="repeat_email" /></form:label>
<form:errors path="email2" element="div" class="text-error"/>
<form:input path="email2" class="input-block-level" placeholder="Email address" />

<form:label path="password"><s:message code="password" /></form:label>
<form:errors path="password" element="div" class="text-error"/>
<form:password path="password" class="input-block-level" placeholder="Password" />

<form:label path="password2"><s:message code="repeat_password" /> </form:label>
<form:errors path="password2" element="div" class="text-error"/>
<form:password path="password2" class="input-block-level" placeholder="Password" />

现在 - 在我的页面上,当我尝试提交空表单时,我得到了

E-mail
The value may not be empty!

Password
Password must be at least 6 characters long
The value may not be empty!

对于password字段,我从两个验证器中得到错误 - 这是非常不受欢迎的。 在email字段的情况下,我理解空字符串是有效的电子邮件地址(?!),这就是为什么我当时只收到一条消息。

那么是否可以按指定的顺序运行验证并在第一次失败后停止处理或仅获取第一条消息?

2 个答案:

答案 0 :(得分:0)

Bean Validation规范定义了用于定义有序验证的组序列。我们的想法是您要为密码电子邮件定义序列,然后在验证值时需要将正确的组序列传递给验证器。但是,我不知道自己如何在JSF中指定/定位正确的组。

要更具体地解决您的问题,您可以使用单个 @Pattern 约束来表达约束,或者编写自定义 @Password 约束。在后一种情况下,您可以利用约束组合和 @ReportAsSingleViolation

答案 1 :(得分:0)

出于文档目的,这实际上是针对那些尝试使用Validator API手动验证其bean并希望在第一次失败时停止的人,无论为该特定字段定义了多少次验证(可能失败)。

按照Hardy的说法,当将组分配给每个验证并定义@GroupSequence时,在验证时,验证将从第一个失败的组停止。

这是验证分组的好例子baeldung.com/javax-validation-groups

  • 只需确保将bean的类本身包含为@GroupSequence中的最后一个组