【问题标题】:Spring 4 validator NoClassDefFoundErrorSpring 4 验证器 NoClassDefFoundError
【发布时间】:2014-12-25 15:18:34
【问题描述】:

我正在使用 Java 1.7.0_09、完全无 xml 的 Spring 4、Intellij Idea 13.1.6 和 Tomcat 1.0.151。我对 jsr 303 验证有疑问。我正在尝试验证通过 POST 方法传递给 spring 的表单。这是我的代码:

控制器:

    @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 库:

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 就够了。

标签: java spring validation spring-mvc


【解决方案1】:

您正在混合使用 Spring bean 验证和 JSR-303 验证。

我遇到了同样的问题,按照这个答案中引用的教程解决了这个问题: Using both JSR-303 and Traditional Bean Validation?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2016-07-14
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多