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