ServletDispatcher нельзя передать в исключение Javax.servlet.Servlet в моем проекте spring

При запуске сервера tomcat я получаю исключение

SEVERE: Servlet /MavenWeb threw load() exception
java.lang.ClassCastException: org.springframework.web.servlet.DispatcherServlet
cannot be cast to javax.servlet.Servlet

Я использую spring3, но есть jar spring2-5-6 в моей папке lib, я удалил его из pom.xml, но все еще появляется в папке lib - хотя я не уверен, что это проблема. Я использую Eclipse IDE. Спасибо!!

<dependencies>
    <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.1-api</artifactId>
      <version>1.0.0.Draft-6</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-annotations</artifactId>
      <version>3.5.6-Final</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>3.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>3.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>3.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>3.1.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1-b01</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webflow</artifactId>
      <version>1.0.6</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

Ответы

Ответ 1

Вы не должны использовать несколько версий Spring JAR в одном проекте, но это не проблема.

Проблема, скорее всего, вызвана классами API сервлета, загружаемыми двумя разными загрузчиками классов. Вероятно, у вас есть servlet*.jar или некоторые другие JAR-контейнеры, специфичные для контейнера, в вашей WAR. Удалите их, установив их <scope> на provided в pom.xml.

Ответ 2

В моем случае это не проблема с библиотеками. Я изменил стандартный сервлет, который будет реализован с помощью Spring, поэтому я выполнил эти инструкции, что я перефразирую здесь на всякий случай, когда страница идет вниз позже:

  • Внесите org.springframework.web.HttpRequestHandler вместо расширения javax.Servlet

    public class MyServlet implements HttpRequestHandler {

  • Создал bean в applicationContext.xml(я сделал это в dispatcher-servlet.xml)

    <bean id="MyServlet" class="com.package.to.MyServlet"/>

  • Укажите сервлет в Web.xml, изменив старый класс (com.package.to.MyServlet) на Spring HttpRequestHandlerServlet.

    <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping>

Мне пришлось сделать дополнительный шаг, чтобы избежать исключения FileNotFoundException о applicationContext.xml, сделав следующее в web.xml

<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>