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, но без успеха.

Я что-то пропустил?

ИЗМЕНИТЬ

Примечание. Я пытаюсь отобразить ошибку в форме, установленной через 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>

Ответы

Ответ 1

Я думаю, что у вас может быть такая же проблема, как и я, - см. http://forum.thymeleaf.org/Fields-object-functions-Spring-td3302513.html

там ответил Даниэль Фернандес. В основном ваш объект формы - th: object = "$ {form}" имеет название "form" НО ваш контроллер ищет - "customerForm" (имя класса) - не "форма" (имя переменной)

можно переименовать с помощью @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}"
} 

Ответ 2

Вот как я это делаю в своих формах:

Для отображения всех ошибок я помещаю это в начало моей формы:

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

и для отдельной ошибки я добавляю это после поля (конечно, изменение поля in hasErrors соответствует тестированному полю):

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

Сообщите мне, если это сработает для вас?

Ответ 3

Добавление в ответ @Blejzer: Именование сообщения об ошибке внутри файла messages.properties должно следовать ниже правила именования, поэтому строка сообщения будет возвращена вместо клавиши сообщения:

<имя_поля > . (Имя свойства)

Примечание: Имя объекта не Имя класса

Например, если у вас есть ниже класса пользователя:

class User{
    @NotBlank
    String username;

    @Length(min=6)
    String password;
}

предположим, что в контроллере мы назвали объект под проверкой " пользователь", см. @ModelAttribute ( "пользователь" ):

@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";
}

в приведенном выше фрагменте контроллера, имя объекта " пользователь", а не "Пользователь"

Теперь, чтобы отображать пользовательские сообщения, вы должны называть это сообщение следующим образом:

NotBlank.user.username=User Name is blank
Length.user.password=Password length must be at least 6 letters