2014-05-04 51 views
1

我是Spring 3 MVC的新手,正在嘗試使用Java validation APIHibernate Validator實現JAR進行表單驗證。我正在爲我的應用程序使用Tomcat 6。下面是pom.xmlSpring 3 + Tomcat 6:表單驗證異常 - java.lang.NoSuchMethodError:javax.el.E​​xpressionFactory.newInstance()Ljavax/el/ExpressionFactory;

<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 

下面是包含JSP的form

<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按鈕,我得到錯誤。即使是控制器處理方法,則不會調用和下面的錯誤被拋出:

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

+0

一個簡單的對比複製[闕(http://stackoverflow.com/a/8488916/1066779) – Rembo

+0

@Rembo按照你所提到的線程,我刪除了'servlet的api'罐子依賴,但仍然得到相同的錯誤。請指教 – user182944

回答

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