[Spring MVC-Thymeleaf] - проверка формы и сообщения об ошибках



Я пытаюсь создать форму и проверить ее данные через @Valid на объекте команды.
Проверка выполняется хорошо,но при возвращении в сеть возникает ошибка ocurring.



Вот что у меня есть:



HTML



<div id="content" layout:fragment="contenido">
<div sec:authorize="isAnonymous()">
<form class="form-horizontal" action="#" th:action="@{register}" th:object="${userForm}" method="post">
<input type="hidden" name="_csrf" th:value="${_csrf.token}"/>
<fieldset>
<label for="alias" th:text="#{form.register.alias}">Alias</label>
<input id="alias" type="text" th:field="*{alias}" placeholder="Su alias" required="required" autofocus="autofocus"/>

<label for="pass" th:text="#{form.register.password}">Contraseña</label>
<input id="pass" type="password" th:field="*{password}" pattern="[wd-_]{5,15}" required="required" th:title="#{form.error.password}"/>
<p th:if="${#fields.hasErrors('password')}" th:errors="*{password}">Error en el dato ingresado</p>

<button type="submit" name="save" class="btn btn-primary" th:text="#{control.register}">Registrarme</button>
</fieldset>
</form>
</div>
</div>


Контроллер



@RequestMapping(value = "/register", params = {"save"}, method = RequestMethod.POST) 
public String register (final ModelMap model, @Valid final UsuarioForm userForm, final BindingResult result) {
if (result.hasErrors()) {
return "register";
} else {
return "redirect:/" + HomeController.PAGE_NAME;
}
}


При нажатии на кнопку "submit"вызывается метод "register", result.hasErrors () имеет значение true, поэтому должна отображаться одна и та же страница, но эта ошибка возникает.



Стек



java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userForm' available as request attribute 
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
org.thymeleaf.spring4.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:396)
org.thymeleaf.spring4.util.FieldUtils.getBindStatus(FieldUtils.java:323)
org.thymeleaf.spring4.util.FieldUtils.getBindStatus(FieldUtils.java:289)
org.thymeleaf.spring4.processor.attr.AbstractSpringFieldAttrProcessor.processAttribute(AbstractSpringFieldAttrProcessor.java:98)
org.thymeleaf.processor.attr.AbstractAttrProcessor.doProcess(AbstractAttrProcessor.java:87)
org.thymeleaf.processor.AbstractProcessor.process(AbstractProcessor.java:212)
org.thymeleaf.dom.Node.applyNextProcessor(Node.java:1017)
org.thymeleaf.dom.Node.processNode(Node.java:972)


Если я добавлю: "userForm" к модели в контроллере таким образом:



Модифицированный Контроллер



@RequestMapping(value = "/register", params = {"save"}, method = RequestMethod.POST) 
public String register (final ModelMap model, @Valid final UsuarioForm userForm, final BindingResult result) {
if (result.hasErrors()) {
model.addAttribute("userForm", userForm); //THIS LINE IS ADDED
return "register";
} else {
return "redirect:/" + HomeController.PAGE_NAME;
}
}


Ошибка исчезает, но... выражение в HTML ${#fields.hasErrors('password')} приводит к ложному результату, поэтому я не могу показать сообщения об ошибках пользователю.



Есть ли какие-либо идеи о том, почему происходит такое поведение?
Заранее спасибо!



PS: Я использую Spring MVC 4.1.2 с Thymeleaf 2.1.4

833   1  

1 ответ:

Это

public String register(final ModelMap model,
        @Valid final UsuarioForm userForm,
        final BindingResult result)

Должно быть:

public String register(final ModelMap model,
        @ModelAttribute("userForm") @Valid final UsuarioForm userForm,
        final BindingResult result)

Обратите внимание на @ModelAttribute аннотация.

Comments

    Ничего не найдено.