[英]Spring MVC 3 form validation annotations ignored?
I was learning how to make simple form validation using this tutorial: http://www.raistudies.com/spring/spring-mvc/form-validation-spring-mvc-3-hibernate-validator-jsr-303/ 我正在学习如何使用本教程进行简单的表单验证: http : //www.raistudies.com/spring/spring-mvc/form-validation-spring-mvc-3-hibernate-validator-jsr-303/
The problem is, when I'm entering invalid data (blank fields), there is no errors for user anywhere. 问题是,当我输入无效数据(空白字段)时,任何地方的用户都没有错误。 result.hasErrors() always produce false. result.hasErrors()总是产生错误。
I've produced following code: 我制作了以下代码:
IndexController.java: IndexController.java:
package pl.aadamczyk.springtest.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import pl.aadamczyk.springtest.beans.LoginBean;
@Controller
@RequestMapping("/index")
public class IndexController
{
@RequestMapping(method = RequestMethod.GET)
public String getIndex(ModelMap model)
{
LoginBean loginBean = new LoginBean();
model.addAttribute("loginBean", loginBean);
return "index";
}
}
+ LoginController.java: + LoginController.java:
package pl.aadamczyk.springtest.controllers;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
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 pl.aadamczyk.springtest.beans.LoginBean;
import pl.aadamczyk.springtest.validators.LoginValidator;
@Controller
@RequestMapping("/login")
public class LoginController
{
private LoginValidator loginValidator;
private LoginValidator getValidator()
{
return loginValidator;
}
@Autowired
public void setValidator(LoginValidator loginValidator)
{
this.loginValidator = loginValidator;
}
@RequestMapping(method= RequestMethod.POST)
public String login(@Valid @ModelAttribute(value="loginBean") LoginBean loginBean,
ModelMap model,
BindingResult result)
{
System.out.println(result.hasErrors()); // always false
loginValidator.validate(loginBean, result);
return "redirect:index.html";
}
}
+ LoginValidator.java + LoginValidator.java
package pl.aadamczyk.springtest.validators;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import pl.aadamczyk.springtest.beans.LoginBean;
@Component
public class LoginValidator implements Validator
{
@Override
public boolean supports(Class<?> type)
{
return LoginBean.class.isAssignableFrom(type);
}
@Override
public void validate(Object o, Errors errors)
{
}
}
LoginBean.java: LoginBean.java:
package pl.aadamczyk.springtest.beans;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
public class LoginBean
{
@NotEmpty(message="Username is mandatory.")
@Length(min=3,max=25,message="Username must be between 3 and 25 characters length")
private String username;
@NotEmpty(message="Password field is mandatory.")
@Length(min=3,max=25,message="Password must be between 5 and 25 characters length")
private String password;
// getters+setters skipped
}
Part of index.jsp: index.jsp的一部分:
<form:form method="post" action="login.html" modelAttribute="loginBean">
<table>
<tr>
<td>Login:</td>
<td><form:input path="username"/></td>
<td><form:errors path="username"/></td>
</tr>
<tr>
<td>Password</td>
<td><form:input path="password"/></td>
<td><form:errors path="password"/></td>
</tr>
<tr>
<td colspan="3"><button type="submit">Login</button></td>
</tr>
</table>
</form:form>
Important content of dispatcher-servlet: dispatcher-servlet的重要内容:
<context:annotation-config />
<context:component-scan base-package="pl.aadamczyk.springtest"/>
<mvc:annotation-driven/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
pom.xml dependencies: pom.xml依赖项:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument-tomcat</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc-portlet</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-struts</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>3.0.0.ga</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
To get validation working, make sure you have a recent version of hibernate-validator
in your classpath. 要使验证正常工作,请确保在类路径中有最新版本的hibernate-validator
。
To print the errors in A JSP
page, use something like the following 要在A JSP
页面中打印错误,请使用以下内容
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
...
<spring:hasBindErrors name="person">
<div class="error">
<c:forEach var="error" items="${errors.allErrors}">
<p>Errors ${error.defaultMessage}</p>
</c:forEach>
</div>
</spring:hasBindErrors>
You also need the jstl
and spring-webmvc
libraries in your classpath. 您还需要jstl
和spring-webmvc
在类路径库。
The BindingResult must come right after the model object that is validated or else Spring will fail to validate the object and throw an exception. BindingResult必须在验证的模型对象之后,否则Spring将无法验证对象并抛出异常。
When Spring sees @Valid , it tries to find the validator for the object being validated. 当Spring看到@Valid时 ,它会尝试为要验证的对象找到验证器 。 Spring automatically picks up validation annotations if you have annotation-driven enabled. 如果启用了注释驱动, Spring会自动选择验证注释。 Spring then invokes the validator and puts any errors in the BindingResult and adds the BindingResult to the view model. 然后,Spring调用验证器并将任何错误放入BindingResult中 ,并将BindingResult添加到视图模型中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.