2

Thymeleaf と一緒に Spring MVC を使用します。次のようなThymeleaffields.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')}" 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>

すると、リスト項目として「使用済みのメール」が表示されます。

の動作を明確にし、特に「アプリケーション固有の」エラーの場合に false と評価されるth:if="${#fields.hasErrors('member.email')}"理由を教えてください。

4

1 に答える 1

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
    }

   //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 に答える