2012-03-17 25 views
5

Mặc dù dự án này đã làm việc cho tôi trong một thời gian, tôi là bây giờ nhận được một ngoại lệ khi tôi cố gắng để triển khai ứng dụng bối cảnh của tôi trong Tomcat:Spring MVC - Tại sao ngoại lệ NoSuchMethodError khi triển khai ngữ cảnh?

Servlet /testapp threw load() exception 
java.lang.NoSuchMethodError: org.springframework.core.convert.converter.ConverterRegistry.addConverter(Ljava/lang/Class;Ljava/lang/Class;Lorg/springframework/core/convert/converter/Converter;)V 
    at org.springframework.core.convert.support.DefaultConversionService.addScalarConverters(DefaultConversionService.java:62) 

Từ những gì tôi đã đọc, điều này có thể xảy ra nếu có là nhiều phiên bản của Spring đang được biên dịch trong ứng dụng. Tuy nhiên, tôi đã hoàn toàn xóa kho lưu trữ phụ thuộc cục bộ của mình để xác nhận rằng tôi chỉ có phiên bản tôi muốn trong đường dẫn xây dựng của mình. Các phụ thuộc của tôi như sau:

<properties> 
    <java-version>1.6</java-version> 
    <org.springframework.version>3.1.0.RELEASE</org.springframework.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    </properties> 

    <dependencies> 
    <!-- CGLIB, only required and used for @Configuration usage --> 
    <dependency> 
     <groupId>cglib</groupId> 
     <artifactId>cglib-nodep</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
    <!-- Test --> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.10</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- @Inject --> 
    <dependency> 
     <groupId>javax.inject</groupId> 
     <artifactId>javax.inject</artifactId> 
     <version>1</version> 
    </dependency> 

    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-core-asl</artifactId> 
     <version>1.9.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-eclipse-plugin</artifactId> 
     <version>2.8</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${org.springframework.version}</version> 
     <optional>false</optional> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>jsp-api</artifactId> 
     <version>2.1</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <version>1.2</version> 
    </dependency> 
    </dependencies> 

Tôi không có lỗi trình biên dịch trong dự án Eclipse và nó xây dựng hoàn hảo, không có cảnh báo hoặc lỗi. Tuy nhiên, Tomcat đang đánh dấu servlet thử nghiệm duy nhất của tôi là không có sẵn và khi tôi đuôi các bản ghi, stacktrace ở trên là gợi ý duy nhất của tôi.

Bất kỳ trợ giúp nào mà bất kỳ ai có thể cung cấp đều sẽ được đánh giá cao. Kinh nghiệm của tôi với Spring và Spring MVC là tối thiểu, vì vậy tôi hy vọng đây chỉ đơn giản là một vấn đề newbie đã hoàn toàn thoát khỏi tôi.

+2

Điều đầu tiên tôi làm khi bắt đầu thấy các lỗi bí ẩn là dọn sạch thư mục công việc tomcat ... đáng để thử – nickdos

+0

Mẹo tuyệt vời! Điều này đã giúp tôi xác định vấn đề, cảm ơn rất nhiều! – mchandler

Trả lời

2

Nhờ @nickdos để cung cấp mẹo. Những thay đổi đối với tệp pom.xml của tôi ban đầu khiến tôi gặp rắc rối đã bị xóa và dọn dẹp thư mục công việc của tôi đã đưa tôi trở lại cuộc sống. Tuy nhiên, vấn đề ban đầu của tôi là kết quả của các xung đột được giới thiệu bằng cách bao gồm các lọ Jersey vào dự án của tôi.

Dự án của tôi đã sử dụng Spring v3.x, nhưng các lọ Jersey đã bao gồm sự phụ thuộc vào Spring 2.5, dẫn đến xung đột. Để khắc phục vấn đề này, tôi tuyên bố một số loại trừ như sau:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>${com.sun.jersey.version}</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-client</artifactId> 
    <version>${com.sun.jersey.version}</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>${com.sun.jersey.version}</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey.contribs</groupId> 
    <artifactId>jersey-spring</artifactId> 
    <version>${com.sun.jersey.version}</version> 
    <exclusions> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Các bình luận từ @nickdos đưa dự án của tôi trở lại lên đến tốc độ mà không cần sự bao gồm của Jersey, và bằng cách tuyên bố loại trừ, bây giờ tôi có hỗ trợ cho cả mùa xuân MVC cũng như hỗ trợ Jersey REST mà không có ngoại lệ tải() mà tôi đã báo cáo trước đây.

Cảm ơn tất cả!

Các vấn đề liên quan