在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