Montag, Januar 27, 2020

Classcastexception-Fehler: DispatcherServlet kann nicht umgewandelt werden, Servlet

Habe ich eine neue Spring-MVC-Projekt mit maven-eclipse-und der folgende Fehler wird geworfen:

(Ich habe versucht, einige Lösungen aus dem stackoverflow, die funktioniert nicht in meinem Fall. Einige Probleme mit dem pom.xml die konnte ich nicht finden. Ich fügte hinzu, sofern Umfang für die servlet-api und versucht, das hat nicht funktioniert entweder.)

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

Meine pom.xml ist wie folgt:

<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>com.org</groupId>
<artifactId>Remindem</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>

<name>Remindem</name>
<url>http://maven.apache.org</url>

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.6.8.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>4.0.0.Beta2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
    <dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.1.GA</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4</version>
    </dependency>

    <!-- Spring framework -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>2.5.6</version>
        <scope>compile</scope>

    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.3.RELEASE</version>
        <scope>compile</scope>
    </dependency>


    <!-- Spring MVC framework -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>2.5.6</version>
        <scope>compile</scope>
    </dependency>

    <!-- JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.1.2</version>
    </dependency>

    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-api</artifactId>
        <version>7.0.19</version>
    </dependency>
</dependencies>

<build>
    <plugins>
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <configuration>
      <url>http://localhost:8080/Remindem</url>
    </configuration>
  </plugin>
    </plugins>
</build>

Meine web.xml ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Remindem</display-name>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

     <servlet>
        <servlet-name>svn</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/SpringAppServlet.xml               
            </param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
</servlet> 

 <servlet-mapping>
    <servlet-name>svn</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping> 

 <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

</web-app>
InformationsquelleAutor Arun | 2013-07-22

4 Kommentare

  1. 20

    Ändern

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>compile</scope>
    </dependency>

    zu

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>

    provided hat diese Beschreibung:

    Dies ist ähnlich wie kompilieren, aber zeigt an, dass Sie erwarten, dass die JDK oder eine
    container bieten die Abhängigkeit zur Laufzeit. Zum Beispiel, wenn
    Aufbau einer web-Anwendung für die Java Enterprise Edition würde
    legen Sie die Abhängigkeit von der Servlet-API und die zugehörigen Java-EE-APIs
    Umfang bereitgestellt, da der web-container stellt diese Klassen. Diese
    Umfang ist nur verfügbar auf der Kompilations-und test-Klassenpfad, und ist
    nicht transitiv.

    aus der maven docs. Sie sind im Grunde sagen, Maven zur Verfügung gestellt, das Glas für die Zusammenstellung, aber zur Laufzeit, verwenden einige andere, die servlet-Containers, jar.

    • Ich änderte es. Aber es immer noch wirft den gleichen Fehler. Muss ich noch was ändern?
    • Was container-version sind Sie auf? Versuchen Sie, die Reinigung und den Wiederaufbau Ihres Projekts in Eclipse und mit Maven.
    • Ich bin nicht sicher, dass die container-version, die ich verwende. Aber, dies ist, wie ich. Ich Laufe maven-clean, maven installieren und dann die maven-build, für die ich liefern dem Ziel, als tomcat:run
    • Ist es alles, was Sie brauchen, von Ihrer maven tomcat Abhängigkeit? Wenn nicht, entfernen Sie es. Etwas Herumspielen mit Ihren Servlet jar-Versionen.
    • Ich entfernte die tomcat-Abhängigkeit und immer noch der gleiche Fehler
    • Auch, aktualisieren Sie bitte Ihren spring-Versionen für alle dasselbe sein, so viel wie möglich.
    • Immer noch der gleiche Fehler. Jul 23, 2013 1:45:51 PM org.apache.catalina.startup.Embedded start INFO: Starting tomcat-server Jul 23, 2013 1:45:51 PM org.apache.catalina.core.StandardEngine start INFO: Starting Servlet Engine: Apache Tomcat/6.0.29 Jul 23, 2013 1:45:52 PM org.apache.catalina.core.Datei ApplicationContext log INFO: Kennzeichnung servlet svn als nicht verfügbar Jul 23, 2013 1:45:52 PM org.apache.catalina.core.StandardContext loadOnStartup SCHWERWIEGEND: Servlet /Remindem warf load() exception java.lang.Classcastexception-Fehler: org.springframework.web.- servlet.DispatcherServlet kann nicht umgewandelt werden, javax.- servlet.Servle
    • Es funktionierte, indem Sie ändern den Umfang als vorgesehen… Es war ein problem mit dem Attribut name in contextParam in web.xml.. Danke für die Hilfe
    • Klar, ich war immer besorgt, lol.
    • Dies löste das gleiche Problem bei mir. Können Sie uns mehr Klarheit, wie, warum (also, wie Sie wusste, es zu ändern zur Verfügung gestellt, zur Lösung dieser Art von Problem)?

  2. 2

    In Ihrem Fall, classcastexception-Fehler zu sein scheint, weil von Klassen geladen werden, die von verschiedenen classloadern. Sagen, Sie haben die servlet-api.jar enthalten Fehler in Ihren WEB-INF/lib und die Sie gesetzt hatte PARENT_LAST gilt auch für Ihre Web-App-class-loader. Wenn Sie auf einem application server wie dem auch WAR, dies würde bedeuten, dass Sie laden-interface mit einem class-loader (einige class-loader oben) und-Implementierung (servlet-api jar nur z.B.) mit einem anderen class loader an der Unterseite.

  3. 0

    Dem application server verwendest du? Ich denke, Servlet-Gläser-Dateien sollten durch Ihre Anwendung srver.

    • Ich mache einen maven-build und stellen das Ziel so: tomcat:run
    • beantwortet von Sotirios Delimanolis , dass ist genau das, was ich sagen wollte.
    • <Abhängigkeit> <groupId>org.springframework</groupId> <artifactId>Frühling-Rahmen</artifactId> <version>3.2.3.RELEASE</version> <Anwendungsbereich>kompilieren</scope> </Abhängigkeit> entfernen <Anwendungsbereich>kompilieren</scope> und versuchen , ich bin nur der Vergleich den Ihre pom mit meinem Arbeitsbereich pom.
  4. 0

    Halten Geltungsbereich als ‚versehen‘ und versuchen Sie es halten, dass jar im tomcat/lib-Ordner. Dies ist, weil jeder class loader des jeweiligen Krieges zu laden versucht seinen eigenen Servlet-api-Klassen separat,im Vergleich zu application class loader lädt das Servlet-api-Klassen in container-Ebene.

    Also, wenn u können, machen das Glas bewegt, um CATALINA_HOME/lib.Sie haben die benötigten Klassen geladen, die von application class loader nur ein und dieselbe version verwiesen wird quer durch alle Kriege.

    Rahmen ‚zur Verfügung gestellt‘ vermittelt class loader im Krieg level, dass die Klassen erforderlich, für diese ist bereits geladen application class loader und beharrt class loader bei Ihrem Krieg Ebene möglicherweise nicht erforderlich, um erstellen Sie separate Instanzen oder version, für die es verursachen, dass die class cast exception

Kostenlose Online-Tests