2016-05-16 71 views
0
轉換爲Maven的後工作了

我最近轉換現有的動態Web項目在Eclipse中Maven項目,以下從本指南的說明: http://crunchify.com/how-to-convert-existing-java-project-to-maven-in-eclipse/Spring MVC的項目不是在Eclipse

轉換順利完成,但很多錯誤出現在類中,因爲幾個進口不再被識別。然後,我使用這裏描述的指令導入所有的Spring MVC依賴關係: http://crunchify.com/how-to-import-all-spring-mvc-dependencies-to-your-maven-project/ 一切看起來不錯,所有的錯誤消失;但不幸的是,當我試圖運行Tomcat的項目,我得到了以下錯誤消息:

HTTP Status 500 - Servlet.init() for servlet spring-dispatcher threw exception 


type Exception report 

message Servlet.init() for servlet spring-dispatcher threw exception 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 
javax.servlet.ServletException: Servlet.init() for servlet spring-dispatcher threw exception 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Unknown Source) 


root cause 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider; 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Unknown Source) 


root cause 
java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider; 
    org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:142) 
    org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:35) 
    org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:302) 
    org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:266) 
    org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean.afterPropertiesSet(OptionalValidatorFactoryBean.java:40) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755) 
    org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757) 
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
    org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:663) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:629) 
    org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:677) 
    org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:548) 
    org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:489) 
    org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
    javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    java.lang.Thread.run(Unknown Source) 

該項目是工作的罰款之前,我把它轉換成一個Maven項目,所以我想我在轉換過程中錯過了什麼進程和/或何時添加依賴關係。

這裏是我的pom.xml的內容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>SpringMVCBlog</groupId> 
    <artifactId>SpringMVCBlog</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.3</version> 
     <configuration> 
      <source>1.8</source> 
      <target>1.8</target> 
     </configuration> 
     </plugin> 
     <plugin> 
     <artifactId>maven-war-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <warSourceDirectory>WebContent</warSourceDirectory> 
      <failOnMissingWebXml>false</failOnMissingWebXml> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 

    <!-- spring-context which provides core functionality --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 

    <!-- The spring-aop module provides an AOP Alliance-compliant aspect-oriented 
     programming implementation allowing you to define --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 

    <!-- The spring-webmvc module (also known as the Web-Servlet module) contains 
     Spring’s model-view-controller (MVC) and REST Web Services implementation 
     for web applications --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 

    <!-- The spring-web module provides basic web-oriented integration features 
     such as multipart file upload functionality and the initialization of the 
     IoC container using Servlet listeners and a web-oriented application context --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>4.1.6.RELEASE</version> 
    </dependency> 

    <!-- http://mvnrepository.com/artifact/javax.validation/validation-api --> 
    <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
     <version>1.0.0.GA</version> 
    </dependency> 
</dependencies> 

</project> 

我的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
    <display-name>cancella</display-name> 
    <servlet> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <servlet-class> 
        org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

我的彈簧調度-servlet.xml中:

<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 

    xsi:schemaLocation= 
    "http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

    <!-- search all controllers in the defined package --> 
    <context:component-scan base-package="controllers" /> 

    <!-- define view resolver --> 
    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix"> 
      <value>/WEB-INF/jsp/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
    </bean> 

    <!-- mapping resources folder --> 
    <mvc:resources mapping="/resources/**" location="/resources/" /> 
    <mvc:annotation-driven /> 

</beans> 

這是控制器中的代碼:

//create model for view HOME.JSP 
@Controller 
public class HomepageController { 

    @RequestMapping (value="/home", method= RequestMethod.GET) 

    //@ModelAttribute creates HomeViewModel object and autowire params from HOME.JSP 
    //@RequestParam gets the value of "page" from URL and set initial value to 1 
    public ModelAndView createHome (@ModelAttribute(value="hvm") HomeViewModel hvm, 
            @RequestParam (value="page", defaultValue="1") int page) { 

     ModelAndView model= new ModelAndView("home"); 

     try { 

      //generate list of ID and name for all restaurants in tab Articolo 
      hvm.generateListaAllArticoli(); 

      //generate list of articles to display in current page 
      hvm.generateListaArticoliRM(page); 

     } catch (SQLException e) { 
      System.out.println("failed to create HomeViewModel"); 
      e.printStackTrace(); 
     } 

     //hvm is automatically added to the model by @ModelAttribute 
     return model; 
    } 

} 

我沒有觸及最後兩個xml文件或servlet,所以我會排除這些文件中的錯誤。

任何想法問題出在哪裏?預先感謝您的任何幫助。

回答

1

如果您看到下面的錯誤,說明有NoSuchMethodError。很可能在你的類路徑中可能存在衝突的瓶子,或者沒有特定方法的瓶子的錯誤版本。

root cause 
java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider; 
    org.hibernate.validator.internal.engine.ValidatorFactoryImpl.<init>(ValidatorFactoryImpl.java:142) 
org.hibernate.validator.HibernateValidator.buildValidatorFactory(HibernateValidator.java:35) 

我會說嘗試在您的pom.xml中添加以下依賴項。

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
     <version>5.0.3.Final</version> 
</dependency> 

當您添加hibernate-validator到pom.xml中,行家可能會自動添加它的依賴JAR validation-api 1.1.0.Final。在這種情況下,請刪除已存在的validation-api 1.0.0.GA,因爲這可能會導致衝突。

+0

我添加了你建議的依賴項,Maven沒有自動添加validation-api 1.1.0.Final,我再次運行該程序,但得到了相同的錯誤消息。 –

+0

你可以清理和建立你的應用程序?在新部署之前清理服務器。 – Aditya

+0

我添加了你建議的依賴項,Maven沒有自動添加validation-api 1.1.0.Final,我再次運行該程序,但得到了相同的錯誤消息。然而,既然你說過可能存在一些衝突的jar,我將Maven Dependencies庫的內容與存儲在WEB-INF/lib文件夾中的jar進行了比較,事實上我發現了一些衝突:構建路徑中的所有Spring依賴項都是版本4.1.6,而在lib文件夾中是版本4.2.0。另外validation-api和hibernate-validator jar也不一樣。 –

0

好的我解決了這個問題:正如Aditya所建議的,我的類路徑中的罐子與存儲在我的WEB-INF/lib文件夾中的罐子相沖突。因此,我手動將POM文件與lib文件夾的內容對齊,在清理應用程序和服務器之後,它終於奏效了!

謝謝Aditya的幫助。

相關問題