使用 Thymeleaf 的"fields.hasErrors"在 Web UI 中显示"特定于应用程序的"验证错误



我将Spring MVC与Thymelaf一起使用。我对Thymelaf fields.hasErrors有一个问题,如下所示:

当引发Bean验证约束错误(例如@NotNull约束)时,以下fields.hasErrors的使用非常有效:

<span class="help-inline" th:if="${#fields.hasErrors('member.email')}" th:text="#{message_form.validation.email}"></span>

电子邮件字段旁边会显示一条错误消息"OK"。

但是,当我的代码引发"应用程序特定"错误(与Bean验证约束错误

// FROM SPRING MVC CONTROLLER
if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
    bindingResult.addError(new ObjectError("member.email", "email already used")); // TODO i18n
}

th:if="${#fields.hasErrors('member.email')}"未计算为true,并且不会显示任何错误消息。。。。

我发现显示这些"特定应用程序"错误的唯一方法是在表单下面包含以下内容:

<div id="errors" class="alert alert-error">
    <ul th:if="${#fields.hasErrors('*')}">
        <li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>
    </ul>
</div>

然后,它将显示"电子邮件已使用"作为列表项。

有人能澄清th:if="${#fields.hasErrors('member.email')}"的行为吗?特别是告诉我,在"特定于应用程序"的错误的情况下,为什么会评估为false

我找到了解决问题的方法:我的问题来自对Spring API的错误使用。

我应该使用FieldError而不是ObjectError

因此,从

   //FROM SPRING MVC CONTROLLER
    if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
        bindingResult.addError(new ObjectError("member.email", "email already used"));//TODO i18n
    }

   //FROM SPRING MVC CONTROLLER
    if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) {
        bindingResult.addError(new FieldError("registrationInfo","member.email", "email already used"));//TODO i18n
    }

解决了问题。

最新更新