Java hibernate验证程序doen';t使用SpringMVC应用程序
我正在遵循《行动中的春天》第四册中的一个示例项目。然而,我在第5章受阻,在那里使用hibernate验证器验证表单提交的值。以下是一些相关代码: 我有一个叫斯皮特的模特:Java hibernate验证程序doen';t使用SpringMVC应用程序,java,spring,spring-mvc,hibernate-validator,Java,Spring,Spring Mvc,Hibernate Validator,我正在遵循《行动中的春天》第四册中的一个示例项目。然而,我在第5章受阻,在那里使用hibernate验证器验证表单提交的值。以下是一些相关代码: 我有一个叫斯皮特的模特: package spittr; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import javax.validation.constrain
package spittr;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
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;
}
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;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public boolean equals(Object that) {
return EqualsBuilder.reflectionEquals(this, that, "firstName", "lastName", "username", "password", "email");
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this, "firstName", "lastName", "username", "password", "email");
}
}
控制器收集表单数据并对其进行验证:
package spittr.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import spittr.Spitter;
import spittr.data.SpitterRepository;
import javax.validation.Valid;
@Controller
@RequestMapping("/spitter")
public class SpitterController {
private SpitterRepository spitterRepository;
@Autowired
public SpitterController(SpitterRepository spitterRepository) {
this.spitterRepository = spitterRepository;
}
@RequestMapping(value = "register", method = RequestMethod.POST)
public String processRegistration(@Valid Spitter spitter, Errors errors) {
System.out.println(errors.hasErrors() + ": has errors...");
if (errors.hasErrors()){
return "registerForm";
}
spitterRepository.save(spitter);
return "redirect:/spitter/" + spitter.getUsername();
}
}
以及配置文件(基于Java):
SpitterWebInitializer:
包spittr.config
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import spittr.web.WebConfig;
public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
build.gradle文件:
apply plugin: 'war'
apply plugin: 'idea'
apply plugin: 'java'
//apply from: 'gretty.plugin'
apply plugin: 'com.bmuschko.tomcat'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.bmuschko:gradle-tomcat-plugin:2.2.2'
}
}
dependencies {
compile "org.springframework:spring-webmvc:4.0.7.RELEASE"
compile "org.springframework:spring-jdbc:4.0.7.RELEASE"
compile "org.hibernate:hibernate-validator:5.3.2.Final"
//providedCompile "org.glassfish.web:javax.el:2.2.4"
// https://mvnrepository.com/artifact/javax.validation/validation-api
providedCompile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
compile "javax.servlet:jstl:1.2"
compile "org.apache.commons:commons-lang3:3.1"
def tomcatVersion = '7.0.59'
tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
"org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}",
"org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
providedCompile "javax.servlet.jsp:jsp-api:2.1"
providedCompile "javax.el:javax.el-api:2.2.4"
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
repositories {
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven { url 'http://maven.springframework.org/release' }
maven { url 'http://maven.springframework.org/milestone' }
maven { url 'http://maven.springframework.org/snapshot' }
maven { url 'http://download.java.net/maven/2' }
mavenCentral()
}
war {
baseName = 'spittr'
version = '0.1.0'
}
tomcat {
httpPort = 8080
httpsPort = 8443
enableSSL = true
// contextPath = 'sample-app'
}
GitHub提供完整项目:
我花了几天时间在谷歌和Stackoverflow上搜索解决方案,但运气不好
请给我一些帮助,谢谢 我不熟悉Gradle,但我认为如果您删除这一行,它会起作用:
providedCompile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
至少我用Maven测试了它,它解决了问题。将
@Validated
注释添加到控制器类:
@Controller
@Validated
@RequestMapping("/spitter")
public class SpitterController {
...
默认情况下,hibernate验证器使用javax [INFO]|+-org.hibernate.validator:hibernate validator:jar:6.0.12.Final:compile [INFO]| |+-(javax.validation:validation-api:jar:1.1.0.Final:
尝试升级到最新版本javax。验证:验证api:2.0.1.Final这对我来说很有效。这会导致一个新问题,似乎与gradle tomcat插件有关,我也不知道。这个解决方案也与gradle有关,我刚刚测试了它:我克隆了你的Github repo。然后我替换了
buil的内容d、 gradle
是您在Stackoverflow上发布的一个。然后,我添加了一堆@NotNull
和@Size
注释,正如您在帖子中所描述的,验证不起作用。但随后我注释掉了这一行,验证工作正常。注意:我使用命令gradle tomcatRun。真奇怪,你用的是什么gradle版本?我用的是Github repo的捆绑gradle包装器——显然是gradle 4.10。如果我注释掉这一行,然后运行gradle tomcatRun,我会遇到这样的异常:org.springframework.beans.factory.BeanCreationException:创建名为“requestMappingHandlerAdapter”的bean时出错,该bean在clas中定义为“requestMappingHandlerAdapter”s org.springframework.web.servlet.config.annotation.delegatingwebmvc配置:bean实例化失败;嵌套异常为org.springframework.beans.factory.BeanDefinitionStoreException:factory方法[public org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter org.springframework.web.servlet.config.annotation…..谢谢你的建议,但还是没有运气。我升级:编译“org.hibernate:hibernate validator:6.0.13.Final”,providedCompile组:'javax.validation',名称:'validation api',版本:'2.0.1.Final',仍不工作。
providedCompile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final'
@Controller
@Validated
@RequestMapping("/spitter")
public class SpitterController {
...