0
我使用Java 1.7.0_09,Spring 4完全無xml,Intellij Idea 13.1.6和Tomcat 1.0.151。我有問題與jsr 303驗證。我想通過POST方法驗證傳遞給spring的表單。這裏是我的代碼:Spring 4驗證器NoClassDefFoundError
控制器:
@RequestMapping(value="/register", method=POST)
public String processRegistration(@Valid Spitter spitter, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "registerForm";
}
repository.save(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}
這裏是我的豆:
public class Spitter {
private Long id;
@NotNull
@Size(min=5, max=16)
private String username;
@NotNull
@Size(min=5, max=25)
private String password;
@NotNull
@Size(min=2, max=30)
private String firstName;
@NotNull
@Size(min=2, max=30)
private String lastName;
private String email;
public Spitter() {}
public Spitter(String username, String password, String firstName, String lastName, String email) {
this(null, username, password, firstName, lastName, email);
}
public Spitter(Long id, String username, String password, String firstName, String lastName, String email) {
this.id = id;
this.username = username;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
}
形式:
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<sf:form method="POST" commandName="spitter">
First name: <sf:input path="firstName"/><br/>
<sf:errors path="firstName" /><br/>
Last name: <sf:input path="lastName"/><br/>
Email: <sf:input path="email"/><br/>
Username: <sf:input path="username"/><br/>
Password: <sf:input path="password"/><br/>
<input type="submit" value="Register"/>
</sf:form>
Maven的文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>SpringTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.8</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>
個
我的Tomcat的lib罐子:
annotations-api.jar
catalina-ant.jar
catalina-ha.jar
catalina-storeconfig.jar
catalina-tribes.jar
catalina.jar
ecj-4.4.jar
el-api.jar
jasper-el.jar
jasper.jar
jsp-api.jar
jstl-1.2.jar
servlet-api.jar
slf4j-api-1.7.9.jar
tomcat-api.jar
tomcat-coyote.jar
tomcat-dbcp.jar
tomcat-i18n-es.jar
tomcat-i18n-fr.jar
tomcat-i18n-ja.jar
tomcat-jdbc.jar
tomcat-jni.jar
tomcat-spdy.jar
tomcat-util-scan.jar
tomcat-util.jar
tomcat-websocket.jar
websocket-api.jar
驗證似乎不點火的。無論輸入形式如何
if (bindingResult.hasErrors())
總是錯誤的。
爲了調試這個,我寫了一些單元測試。這裏是:
@Test
public void carIsValid() {
Spitter car = new Spitter("aaaaaa","aaaaaa","aaaaaa","aaaaaa","aaaaaa");
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Spitter>> constraintViolations = validator.validate(car);
assertEquals(0, constraintViolations.size());
}
這裏驗證工程就像一個魅力。因爲我嘗試驗證輸入表格一樣,所以我改變我的控制器代碼:
@RequestMapping(value="/register", method=POST)
public String processRegistration(Spitter spitter) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
if (validator.validate(spitter).size() > 0) {
return "registerForm";
}
repository.save(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}
但現在我得到錯誤:
java.lang.NoClassDefFoundError: javax/validation/Validation
你能告訴我,爲什麼驗證不自動,爲什麼工作當我嘗試手動驗證它時,它僅適用於單元測試並在控制器代碼中崩潰?
依賴於'javax.validation'似乎是多餘的給我。 'hibernate-validator'就足夠了。 –