Spring 3 + Tomcat 6:表单验证异常 - java.lang.NoSuchMethodError:javax.el.E​​xpressionFactory.newInstance()Ljavax / el / ExpressionFactory;

时间:2014-05-04 09:33:41

标签: java spring maven tomcat spring-mvc

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

<properties>  
<spring.version>3.1.1.RELEASE</spring.version>  
<jdk.version>1.6</jdk.version>  
</properties>

<dependencies>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-core</artifactId>  
        <version>${spring.version}</version>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-web</artifactId>  
        <version>${spring.version}</version>  
    </dependency>  

    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-webmvc</artifactId>  
        <version>${spring.version}</version>  
    </dependency>  

    <!-- CGLIB is required to process @Configuration classes -->  
    <dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2.2</version>
</dependency>

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
</dependency>            

    <dependency>  
        <groupId>junit</groupId>  
        <artifactId>junit</artifactId>  
        <version>3.8.1</version>  
        <scope>test</scope>  
    </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.0.1.Final</version>
    </dependency>
       </dependencies>  

以下是模型类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
<form:form method="post" commandName="empl" action="validate">
<table>
    <tr>
        <td>
            <label for="nameInput">Name:</label>
        </td>
        <td>
            <form:input path="name" id="nameInput"/>
            <form:errors path="name"></form:errors>
        </td>
    </tr>
    <tr>
        <td>
            <label for="ageInput">Age:</label>
        </td>
        <td>
            <form:input path="age" id="ageInput"/>
            <form:errors path="age"></form:errors>
        </td>
    </tr>
    <tr>
        <td>
            <label for="phoneInput">Phone:</label>
        </td>
        <td>
            <form:input path="phone" id="phoneInput"/>
            <form:errors path="phone"></form:errors>
        </td>
    </tr>
    <tr>
        <td>
            <label for="emailInput">Email:</label>
        </td>
        <td>
            <form:input path="email" id="emailInput"/>
            <form:errors path="email"></form:errors>
        </td>
    </tr>
    <%--<tr>
        <td>
            <label for="birthdayInput">Birthday:</label>
        </td>
        <td>
            <form:input path="birthday" id="birthdayInput" placeholder="MM/DD/YYYY"/>
            <form:errors path="birthday"></form:errors>
        </td>
    </tr>
     <tr>
        <td>
            <label for="genderInput">Birthday:</label>
        </td>
        <td>
            <form:select id="genderInput" path="" items="${gender }">      </form:select>
            <form:errors path="birthday"></form:errors>
        </td>
    </tr> --%>
    <tr>
        <td colspan="2">
            <input type="submit" value="Submit">
        </td>
    </tr>
</table>
</form:form>

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

java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;
org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTerm.<clinit>(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)

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

<dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.2</version>
    </dependency>

请告知如何解决此问题。

修改

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

<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>

然后我收到以下错误:

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

以下是罐子的快照:

enter image description here

2 个答案:

答案 0 :(得分:7)

问题是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

答案 1 :(得分:1)

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

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

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