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

bal*_*teo 2 spring-mvc bean-validation thymeleaf

我和Thymeleaf一起使用Spring MVC.我对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>
Run Code Online (Sandbox Code Playgroud)

电子邮件字段旁边显示错误消息确定.

但是,当我的代码引发"特定于应用程序"的错误(与Bean Validation约束错误相反)时(请参阅下面的控制器中的代码),

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

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>
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以请澄清行为,th:if="${#fields.hasErrors('member.email')}"特别是告诉我为什么它会在"特定应用程序"错误的情况下评估为false

bal*_*teo 8

我找到了解决方案:我的问题来自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
    }
Run Code Online (Sandbox Code Playgroud)

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

解决了这个问题.