[英]Spring MVC 3 form validation annotations ignored?
我正在學習如何使用本教程進行簡單的表單驗證: http : //www.raistudies.com/spring/spring-mvc/form-validation-spring-mvc-3-hibernate-validator-jsr-303/
問題是,當我輸入無效數據(空白字段)時,任何地方的用戶都沒有錯誤。 result.hasErrors()總是產生錯誤。
我制作了以下代碼:
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:
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的一部分:
<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>
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依賴項:
<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>
要使驗證正常工作,請確保在類路徑中有最新版本的hibernate-validator
。
要在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>
您還需要jstl
和spring-webmvc
在類路徑庫。
BindingResult必須在驗證的模型對象之后,否則Spring將無法驗證對象並拋出異常。
當Spring看到@Valid時 ,它會嘗試為要驗證的對象找到驗證器 。 如果啟用了注釋驅動, Spring會自動選擇驗證注釋。 然后,Spring調用驗證器並將任何錯誤放入BindingResult中 ,並將BindingResult添加到視圖模型中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.