2012-09-16 65 views
0

我正在学习如何使用本教程进行简单的表单验证: http://www.raistudies.com/spring/spring-mvc/form-validation-spring-mvc-3-hibernate-validator-jsr-303/Spring MVC 3表单验证注释被忽略?

的问题是,当我输入无效数据(空白字段),对用户没有任何错误的任何地方。 result.hasErrors()总是产生false。

我产生以下代码:

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:

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

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:

<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> 
调度员的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的依赖关系:

<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> 

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 
} 

的index.jsp的部分

+1

你确定在编译之后你的类路径中有hibernate-validator吗? –

+0

我已经将hibernate-validator-4.1.0.Final.jar添加到WEB-INF/lib文件夹中,无需更改。 Hibernate-validator-3.0.0.ga.jar在Mavens的依赖中。我在第一篇文章中包含了我的pom.xml。 –

+0

好的,我已经包含了ant-apache-log4j-1.6.5,hibernate-validator-4.3.0.Final,slf4j-api-1.6.6,slf4j-log4j12-1.6.6到我的依赖项,它似乎工作正常现在。另外,我必须将BindingResult结果更接近LoginBean loginBean参数。 result.hasErrors()现在返回true,但html中仍然没有消息。 –

回答

1

要获得验证工作,请确保在类路径中有近期版本的hibernate-validator

要打印中的错误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> 

您还需要在类路径中jstlspring-webmvc库。

+0

但是我没有使用你的解决方案,你的帖子为我提供了食物。我通过(重新)将loginBean添加到模型中,并将返回值从“redirect:index”更改为“index”来解决显示窗体错误的问题。谢谢。 –

1

BindingResult必须在验证了模型对象后立即来到否则将无法​​验证的对象,并抛出一个异常。

看到@Valid,它试图找到验证为对象进行验证。如果您启用了注释驱动,Spring将自动提取验证注释。 Spring然后调用验证器并将任何错误放入BindingResult并将BindingResult添加到视图模型。