5

このプロジェクトはしばらくの間機能していましたが、アプリケーションコンテキストをTomcatにデプロイしようとすると、例外が発生します。

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)

私が読んだところによると、これは、アプリでコンパイルされているSpringのバージョンが複数ある場合に発生する可能性があります。ただし、依存関係のローカルリポジトリを完全に削除して、ビルドパスに必要なバージョンのみがあることを確認しました。私の依存関係は次のとおりです。

<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>

Eclipseプロジェクトにコンパイラエラーはなく、警告やエラーもなく完全にビルドされます。ただし、Tomcatは、単一のテストサーブレットが使用不可であることを示しており、ログを追跡する場合、上記のスタックトレースが唯一のヒントです。

誰もが提供できるどんな助けでも大歓迎です。SpringとSpringMVCでの私の経験は最小限であるため、これが完全に私を免れた初心者の問題であることを願っています。

4

1 に答える 1

2

ヒントを提供してくれた @nickdos に感謝します。最初に問題を引き起こした pom.xml への変更は削除され、作業ディレクトリをパージすることで元に戻りました。しかし、私の最初の問題は、Jersey jar をプロジェクトに含めることによって引き起こされた競合の結果でした。

私のプロジェクトでは Spring v3.x を使用していましたが、Jersey jar には Spring 2.5 への依存関係が含まれていたため、競合が発生しました。この問題を解決するために、次のようにいくつかの除外を宣言しました。

<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>

@nickdos からのコメントにより、Jersey を含めずに私のプロジェクトがスピードアップし、除外を宣言することで、以前に報告した load() 例外なしで Spring MVC と Jersey REST サポートの両方をサポートできるようになりました。

皆さんありがとう!

于 2012-03-18T05:08:25.217 に答える