Spring 3 + Tomcat 6:表单validationexception – java.lang.NoSuchMethodError:javax.el.E​​xpressionFactory.newInstance()Ljavax / el / ExpressionFactory;

我是Spring 3 MVC的新手,正在尝试使用Java validation APIHibernate Validator实现JAR进行表单validation。 我正在使用Tomcat 6作为我的应用程序。 下面是pom.xml

  3.1.1.RELEASE 1.6    org.springframework spring-core ${spring.version}   org.springframework spring-web ${spring.version}   org.springframework spring-webmvc ${spring.version}    cglib cglib 2.2.2   javax.servlet jstl 1.2   javax.servlet javax.servlet-api 3.0.1   junit junit 3.8.1 test   javax.validation validation-api 1.1.0.Final   org.hibernate hibernate-validator 5.0.1.Final   

下面是模型类Employee.java

 @Size(min=2,max=30) private String name; @NotEmpty @Email private String email; @NotNull @Min(18) @Max(35) private Integer age; @Size(min=10) private String phone; // Getters and Setters 

下面是包含form的JSP:

 
<%-- --%>

当我单击submit按钮时,我收到错误。 甚至不调用Controller处理程序方法,并抛出以下错误:

 java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory; org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTerm.(InterpolationTerm.java:60) org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateExpression(ResourceBundleMessageInterpolator.java:227) org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateMessage(ResourceBundleMessageInterpolator.java:187) org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolate(ResourceBundleMessageInterpolator.java:120) org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator.interpolate(LocaleContextMessageInterpolator.java:49) org.hibernate.validator.internal.engine.ValidationContext.interpolate(ValidationContext.java:370) org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolation(ValidationContext.java:284) org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolations(ValidationContext.java:246) org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:289) org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:133) org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateComposingConstraints(ConstraintTree.java:233) org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:102) org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91) org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85) org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:478) org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424) org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388) org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340) org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:158) org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:101) org.springframework.validation.DataBinder.validate(DataBinder.java:722) org.springframework.web.method.annotation.ModelAttributeMethodProcessor.validateIfApplicable(ModelAttributeMethodProcessor.java:155) org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:108) org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75) org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) javax.servlet.http.HttpServlet.service(HttpServlet.java:637) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

我尝试添加以下依赖项但没有用(因此之后将其删除):

  javax.el el-api 2.2  

请告知如何解决此问题。

编辑

如果我添加此依赖项(但没有用,因此也删除它):

  org.glassfish.web el-impl 2.2  

然后我收到以下错误:

 java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/index_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature at org.apache.jsp.index_jsp._jspInit(index_jsp.java:22) at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52) at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:164) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:340) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:662) 

编辑2

以下是jar子的快照:

在此处输入图像描述

问题是Tomcat 6发布了旧版本的EL(2.1),而Hibernate Validator 5.x需要更新的EL 2.2。 请查看: http : //hibernate.org/validator/faq/#does-hibernate-validator-5-x-work-with-tomcat-6 。

您可以使用4.3.1.Final版本的hibernate-validator,这将解决主要问题。编辑中提到的更改不是必需的。这是假设您不需要EL 2.2的function作为您正在尝试的示例是一个基本的。

你仍然可以使用最新的hibernate-validator jar,但正如你所指出的,你需要升级到tomcat 7或者在tomcat lib中拥有最新的EL 2.2 jar。

这里有一个简单的比较http://tomcat.apache.org/whichversion.html