2017-09-24 77 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上運行它)。