我在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.ExpressionFactory.newInstance(未知来源)&#34;之前导致&#34; java.lang.ClassNotFoundException:javax.el.ExpressionFactory&#34;。
我很感激有关如何解决/调试问题的任何提示......
答案 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上运行它)。