Spring4 MVC表单验证result.hasErrors()始终为false

时间:2016-04-17 13:48:18

标签: validation spring-mvc xml-configuration

我正在使用validation-api-1.1.0.Final.jar来有效地在Spring 4 MVC中输入表单。但是我被困在这里,结果.hasErrors()似乎总是假的(这意味着@Valid无法正常工作)。我遵循了本指南Validating Form Input,但该指南使用Spring Boot验证表单输入。我正在使用Tomcat 8而不是使用Spring Boot。我已经对此进行了大量搜索,但问题仍然存在。 寻求帮助。 谢谢!

项目结构:

Project Structure

UserController.java

package com.ro.user.controller;

import com.ro.user.model.UserModel;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.validation.Valid;

@Controller
public class UserController {
    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public UserModel user(Model model) {

        UserModel userModel = new UserModel();
        model.addAttribute("userModel", userModel);

        return userModel;
    }

    @RequestMapping(value = "/userLogin", method = RequestMethod.POST)
    public String userLogin(@Valid @ModelAttribute("userModel") UserModel userModel, BindingResult bindingResult) {
        System.out.println("Before: bindingResult.hasErrors()");
        if (bindingResult.hasErrors()) {
            System.out.println("After: bindingResult.hasErrors()");
            return "user";
        }

        return "result";
    }
}

UserModel.java

package com.ro.user.model;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class UserModel {

    @NotNull
    @Size(min = 6, max = 12)
    private String username;

    @Size(min = 8, max = 16)
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

user.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<html>
<head>
    <title>Spring MVC Form Handling</title>
    <style>
        .error {
            color: #ff0000;
        }

        .errorblock {
            color: #000;
            background-color: #ffEEEE;
            border: 3px solid #ff0000;
            padding: 8px;
            margin: 16px;
        }
    </style>
</head>
<body>

<h2>User Information</h2>
<form:form action="userLogin" modelAttribute="userModel" method="POST">
    <form:errors path="*" cssClass="errorblock" element="div"/>
    <table>
        <tr>
            <td><form:label path="username">Username:</form:label></td>
            <td><form:input path="username"/></td>
            <td><form:errors path="username" cssClass="error"/></td>
        </tr>
        <tr>
            <td><form:label path="password">Password:</form:label></td>
            <td><form:input path="password"/></td>
            <td><form:errors path="username" cssClass="error"/></td>
        </tr>
        <tr>
            <td colspan="3">
                <input type="submit" value="Submit"/>
            </td>
        </tr>
    </table>
</form:form>
</body>
</html>

的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>UserLogin</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>UserLogin</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

用户登陆 - servlet.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <mvc:annotation-driven/>

    <context:component-scan base-package="com.ro.user.controller"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="org.springframework.context.support.ResourceBundleMessageSource" id="messageSource">
        <property name="basename" value="com.ro.user.model.error"/>
    </bean>

</beans>

3 个答案:

答案 0 :(得分:2)

此问题是由于缺少Hibernate Validator的依赖性引起的。它应该将所有Jars添加到项目的lib中名为required的文件夹中(从官方网站下载zip并解压缩,你会看到这个文件夹)。不仅仅是hibernate-validator.jar和validation-api.jar。

答案 1 :(得分:1)

我猜你已经创建了一个自定义HandlerAdapter,然后你需要手动初始化webBinding。

Intent intent = new Intent(Intent.ACTION_SENDTO);
        intent.setType("text/plain");
        intent.putExtra(Intent.EXTRA_TEXT, body);
        intent.setData(Uri.parse("smsto:" + phone));
        intent.setPackage("com.whatsapp");
        context.startActivity(intent);

答案 2 :(得分:0)

我遇到了同样的问题。我通过更改休眠验证器版本解决了它。就我而言,它适用于 6.2 版,但不适用于 7 版。