2017-09-24 80 views
0

在Spring MVC(4.3.9)应用程序中设置验证有一些问题。 基本上,有一个简单的应用程序,将问题分离为一个“联系”表单。 这里是豆形式底层的部分代码:设置Spring表单验证的问题

@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()); 

我得到以下结果:

结果1:假

结果2:真

因此,'g (通过@Valid注释表示)验证不起作用,但是手动调用的验证确实没有效果。

我搜索了一段时间,发现了一个验证bean需要在spring配置中定义的建议。不幸的是,当我添加下面我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没有实施库。这里是我卡住的地方。我尝试了一些依赖(使用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等插件el.jar到Tomcat clasppath。但是,根本没有运气=(

什么是更加sta,的,如果你看看上面的异常,调用实际上会经过“javax.el.E​​xpressionFactory.newInstance(Unknown Source)”,然后导致“java.lang .ClassNotFoundException:javax.el.E​​xpressionFactory”

我是如何修复/调试问题的任何暗示感激......

回答

0

添加这种依赖性

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

关注的解决方案。 here

+0

我曾尝试过,因为我在最初的问题中已经描述过。添加这个依赖关系给出了相同的结果(ClassNotFoundException)。此外,glasfish的javax.el版本3包含了实现以及api – Marek

0

我找到了解决我的问题的方法。看起来很奇怪,当我将附带Tomcat的el.jar添加到catalina.sh中的类路径中时,验证就起作用了。这可能是一个与发行有关的问题(我在Gentoo上运行它)。