web-dev-qa-db-ja.com

ThymeleafがSpringフォームのエラーメッセージを表示しない

Spring jspアプリケーションをThymeleafに移行していますが、フォームエラーの表示に問題があります。

SpringTemplateEngineとThymeleafViewResolverを使用していますが、テンプレートのレンダリングは機能します。また、フォームの値はフォームの入力フィールドに入力されます。

今のところ機能しない唯一のことは、フォームエラーメッセージを表示することです。

私のコントローラーは次のようになります:

@RequestMapping(method = RequestMethod.POST)
String save(@Valid CustomerForm form, BindingResult bindingResult, Model model, RedirectAttributes redirectAttributes) {
    if (bindingResult.hasErrors()) {
        model.addAttribute("form", form)
        return "app/customers/create"
    }
    ....

BindingResultを印刷して、エラーが含まれていることを確認しました。

binding result = org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'customerForm' on field 'name': rejected value []; codes [customerForm.name.NotBlank,name.NotBlank,Java.lang.String.NotBlank,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [customerForm.name,name]; arguments []; default message [name]]; default message [may not be empty]

次を使用してエラーを表示しようとすると:

<ul>
    <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr">
        <span th:text="${e.global}? '*' : ${e.fieldName}">The field name</span> |
        <span th:text="${e.message}">The error message</span>
    </li>
</ul>

エラーは表示されません。

http://www.thymeleaf.org/doc/html/Thymeleaf-Spring3.html#validation-and-error-messages に記載されているさまざまな代替手段を試しましたが、成功しませんでした。

何か不足していますか?

[〜#〜] edit [〜#〜]

注:th:objectを介してフォームセット内にエラーを表示しようとしています。

<form id="customer-form" action="#" th:action="@{/app/customers}" th:object="${form}" method="post" class="form-horizontal">
    <ul>
        <li th:each="e : ${#fields.detailedErrors()}" th:class="${e.global}? globalerr : fielderr">
            <span th:text="${e.global}? '*' : ${e.fieldName}">The field name</span> |
            <span th:text="${e.message}">The error message</span>
        </li>
    </ul>
</form>
25
Marcel Overdijk

あなたが私と同じ問題を抱えている可能性があると思います-ご覧ください:

そこで、_Daniel Fernandez_によって回答されます。基本的に、フォームオブジェクト_th:object="${form}"_は_"form"_という名前になりますbutコントローラは_"customerForm"_(クラス名)を探していますnot _"form"_(変数名)

@ModelAttribute("data")で名前を変更できます

そのリンクからコピー:

_public String post(@Valid FormData formData, BindingResult result, Model model){
    // th:object="${formData}"
}
_

または

_public String post(@Valid @ModelAttribute("data") FormData data, BindingResult result, Model model){
    // th:object="${data}"
} 
_
54
Gary Hellman

これは私のフォームでそれを行う方法です:

すべてのエラーを表示するために、フォームの最初にこれを置きました。

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

個々のエラーについては、フィールドの後にこれを追加します(もちろん、テストするフィールドに対応するようにhasErrorsのフィールドを変更します):

<p th:if="${#fields.hasErrors('vehicle.licensePlate')}" class="label label-danger" th:errors="*{vehicle.licensePlate}">Incorrect LP</p>

これがうまくいくかどうか教えてください。

15
Blejzer

@Blejzer回答に追加:messages.propertiesファイル内のエラーメッセージの命名は命名規則に従う必要があるため、メッセージキーの代わりにメッセージ文字列が返されます。

(制約名)。(オブジェクト名)。(プロパティ名)

注:オブジェクト名はクラス名ではありません

たとえば、以下のUserクラスがある場合:

class User{
    @NotBlank
    String username;

    @Length(min=6)
    String password;
}

コントローラで、検証中のオブジェクトに「ser」という名前を付けたとします。@ ModelAttribute( "user")を参照してください。

@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String signup(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model model) {

    if (bindingResult.hasErrors()) {
        return "signup";
    }

    //do some processing

    return "redirect:/index";
}

上記のコントローラースニペットでは、オブジェクト名は「ser」ではなく「User」です

ここで、カスタムメッセージを表示するには、メッセージに次の名前を付ける必要があります。

NotBlank.user.username=User Name is blank
Length.user.password=Password length must be at least 6 letters
0
Ayman Al-Absi