【问题标题】:Bean validation - stop validation on first errorBean 验证 - 在第一个错误时停止验证
【发布时间】:2013-03-13 22:41:32
【问题描述】:

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

我有一些豆子,像这样注释

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 字段,我知道空字符串是有效的电子邮件地址(?!),这就是为什么我当时只收到一条消息。

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

【问题讨论】:

    标签: java bean-validation


    【解决方案1】:

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

    按照 Hardy 提到的,当为每个验证分配组并定义 @GroupSequence 时,在验证时,验证将在第一个失败的组处停止。

    这是验证分组https://www.baeldung.com/javax-validation-groups的一个很好的例子

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

    【讨论】:

      【解决方案2】:

      Bean Validation 规范定义了组序列来定义有序的验证。这个想法是,您将为 passwordemail 定义一个序列,然后在验证值时需要将正确的组序列传递给验证器。但是,我自己不知道如何在 JSF 中指定/定位正确的组。

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

      【讨论】:

        猜你喜欢
        • 2012-11-14
        • 2016-07-12
        • 1970-01-01
        • 2018-02-11
        • 1970-01-01
        • 2022-10-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        相关资源
        最近更新 更多