【问题标题】:[Spring MVC - Thymeleaf]- Form validation and error messages[Spring MVC - Thymeleaf]- 表单验证和错误消息
【发布时间】:2014-12-29 13:32:08
【问题描述】:

我正在尝试创建一个表单并通过命令对象上的@Valid 验证其数据。 验证执行良好,但返回 Web 时出现错误。

这就是我所拥有的:

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="[\w\d-_]{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; 
    } 
} 

当点击“提交”时,“注册”方法被调用,result.hasErrors() 为真,因此应该显示相同的页面,但出现此错误。

堆栈

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”添加到 Controller 中的模型:

控制器已修改

@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')} 中的表达式结果为 false,因此我无法向用户显示错误消息。

知道为什么会发生这种行为吗? 提前致谢!

PS:我正在使用带有 Thymeleaf 2.1.4 的 Spring MVC 4.1.2

【问题讨论】:

    标签: forms validation spring-mvc thymeleaf


    【解决方案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 注释。

    【讨论】:

    • 效果很好。非常感谢,新年快乐。问候!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2016-02-20
    • 2016-03-27
    • 2018-05-26
    • 2015-07-27
    相关资源
    最近更新 更多