Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring MVC - Why the NoSuchMethodError exception when deploying context?

Despite this project having worked for me for a while, I'm now getting an exception when I attempt to deploy my application context in 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)

From what I've read, this can occur if there are multiple versions of Spring that are being compiled in the app. However, I've completely purged my local repository of dependencies to confirm that I have only the version I want in my build path. My dependencies are as follows:

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

I have no compiler errors in the Eclipse project and it builds perfectly, with no warnings or errors. However, Tomcat is marking my single test servlet is unavailable and when I tail the logs, the stacktrace above is my only hint.

Any help that anyone can offer would be greatly appreciated. My experience with Spring and Spring MVC is minimal, so I'm hoping this is simply a newbie problem that has completely escaped me.

like image 585
mchandler Avatar asked Nov 05 '22 03:11

mchandler


1 Answers

Thanks to @nickdos for offering up a tip. Changes to my pom.xml that initially caused me trouble were removed and purging my work directory brought me back to life. However, my initial problem was a result of conflicts introduced by including Jersey jars into my project.

My project was making use of Spring v3.x, but the Jersey jars were including a dependency on Spring 2.5, resulting in conflicts. To remedy this problem, I declared some exclusions as follows:

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

The comment from @nickdos brought my project back up to speed without the inclusion of Jersey, and by declaring the exclusions, I now have support for both Spring MVC as well as Jersey REST support without the load() exception I was reporting before.

Thanks all!

like image 55
mchandler Avatar answered Nov 09 '22 17:11

mchandler