2

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

当引发Bean Validation 约束错误(例如 @NotNull 约束)时,以下用法fields.hasErrors完美地工作:

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

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

但是,当我的代码引发“特定于应用程序”的错误(与Bean Validation constraint error相对)时(请参阅下面的控制器代码),

// 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')}" 不评估为真,并且不显示错误消息....

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

<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')}"尤其是告诉我为什么在“应用程序特定”错误的情况下它会评估为假

4

1 回答 1

8

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

我应该使用 aFieldError而不是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
    }

解决了这个问题。

于 2012-09-05T11:58:20.337 回答