在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.ExpressionFactory.newInstance(Unknown Source)」,然後導致「java.lang .ClassNotFoundException:javax.el.ExpressionFactory」
我是如何修復/調試問題的任何暗示感激......
我曾嘗試過,因爲我在最初的問題中已經描述過。添加這個依賴關係給出了相同的結果(ClassNotFoundException)。此外,glasfish的javax.el版本3包含了實現以及api – Marek