设置Spring表单验证时遇到问题

时间:2017-09-24 18:36:38

标签: spring maven validation spring-mvc

我在Spring MVC(4.3.9)应用程序中设置验证时遇到了一些问题。 基本上,有一个简单的应用程序,问题被隔离到一个"联系"形成。 以下是表单底层bean的代码的一部分:

@Component
@Scope("request")
public class SendMail {

    @Min(20)
    private String userName;

    @Size(min=10, max=11)
    private String message;

    private String userEmail;

    public static class CustomValidator implements Validator {
        @Override
        public boolean supports(Class clazz) {
            return SendMail.class.equals(clazz);
        }
        @Override
        public void validate(Object targets, Errors errors) {
            SendMail o = (SendMail) targets;

            if (o.getUserName() == null || o.getUserName().length() < 1) {
                errors.rejectValue("userName", "Empty.userName");
            }
        }
    }
    ....
}

以下是相关控制器的一部分:

@RequestMapping(value = {"/contact"}, method = RequestMethod.POST)
public ModelAndView sendEmail(@Valid SendMail sendmail, BindingResult result) {

    System.out.println("Result1: " + result.hasErrors());

    DataBinder binder = new DataBinder(sendmail);
    binder.setValidator(new SendMail.CustomValidator());
    binder.validate();
    result = binder.getBindingResult();

    System.out.println("Result2: " + result.hasErrors());

我得到以下结果:

Result1:false

Result2:true

所以,&#39;将军&#39; (由@Valid注释表示)验证似乎不起作用,但手动调用验证确实有效。

我用Google搜索了一段时间,并且遇到了需要在spring配置中定义验证bean的建议。不幸的是,当我将以下内容添加到我的Config.java时:

....
@Bean(name = "validator")
public Validator getValidator() {

    LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
    return validator;
}

应用程序崩溃时出现以下异常:

....
root cause

java.lang.ClassNotFoundException: javax.el.ExpressionFactory
java.net.URLClassLoader.findClass(URLClassLoader.java:381)
java.lang.ClassLoader.loadClass(ClassLoader.java:424)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
java.lang.ClassLoader.loadClass(ClassLoader.java:357)
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:763)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
java.net.URLClassLoader.access$100(URLClassLoader.java:73)
java.net.URLClassLoader$1.run(URLClassLoader.java:368)
java.net.URLClassLoader$1.run(URLClassLoader.java:362)
java.security.AccessController.doPrivileged(Native Method)
java.net.URLClassLoader.findClass(URLClassLoader.java:361)
java.lang.ClassLoader.loadClass(ClassLoader.java:424)
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
java.lang.ClassLoader.loadClass(ClassLoader.java:411)
java.lang.ClassLoader.loadClass(ClassLoader.java:357)
java.lang.Class.forName0(Native Method)
java.lang.Class.forName(Class.java:348)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(Unknown Source)
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(Unknown Source)
javax.el.ExpressionFactory.newInstance(Unknown Source)
javax.el.ExpressionFactory.newInstance(Unknown Source)
....

据说这表明,EL实现没有lib。这就是我被困的地方。我尝试了一些依赖(使用maven)无济于事。目前我的pom的相关部分看起来像这样:

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</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>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>5.4.1.Final</version>
    </dependency>

我尝试了各种设置,el-impl 2.2等等,将addin el.jar添加到Tomcat clasppath。但根本没有运气=(

更为明确的是,如果你看一下上面的例外情况,这个电话实际上会经过&#34; javax.el.E​​xpressionFactory.newInstance(未知来源)&#34;之前导致&#34; java.lang.ClassNotFoundException:javax.el.E​​xpressionFactory&#34;。

我很感激有关如何解决/调试问题的任何提示......

2 个答案:

答案 0 :(得分:0)

添加此依赖项。

<dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>
    </dependency>

按照解决方案here

答案 1 :(得分:0)

我找到了解决问题的方法。看起来很奇怪,当我将tomcat提供的el.jar添加到catalina.sh中的类路径时,验证工作正常。这可能是一个与发行版相关的问题(我在Gentoo上运行它)。

相关问题