2013-07-22 6 views
7

Servlet ich ein neues Spring MVC-Projekt mit Maven-Eclipse erstellt haben, und der folgende Fehler ausgelöst wird:Classcast: DispatcherServlet kann nicht gegossen werden

(I aus dem Stackoverflow einige Lösungen ausprobiert, die in meinem Fall nicht funktioniert. . ein Problem mit der pom.xml, die ich nicht finden konnte, fügte ich hinzu Spielraum für die Servlet-aPI zur Verfügung gestellt und versucht, die entweder nicht funktioniert)

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

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

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

Antwort

17

ä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 die Kompilierung, sondern zeigen Sie das JDK oder ein Behälter erwarten, dass die zur Verfügung zu stellen Abhängigkeit zur Laufzeit. Wenn Sie zum Beispiel eine Webanwendung für die Java Enterprise Edition erstellen, würden Sie die Abhängigkeit von der Servlet-API und verwandten Java EE-APIs auf festlegen, da der Webcontainer diese Klassen bereitstellt. Dieser Bereich ist nur für den Kompilierungs- und Testklassenpfad verfügbar und ist nicht transitiv.

aus der mavendocs. Du sagst Maven im Grunde, dass er das Glas für die Kompilation zur Verfügung stellen soll, aber zur Laufzeit benutze ein anderes, den Jar des Servlet-Containers.

+0

Ich habe es geändert. Aber es wirft immer noch den gleichen Fehler. Muss ich etwas ändern? – Arun

+0

@user In welcher Containerversion sind Sie? Versuchen Sie, Ihr Projekt in Eclipse und mit Maven zu säubern und neu aufzubauen. –

+1

Ich bin mir nicht sicher, welche Containerversion ich verwende. Aber so renne ich. Ich renne maven clean, maven install und mache dann einen maven build, für den ich das Ziel als tomcat bereitstelle: run – Arun

0

Welche Anwendungsserver Sie verwenden? Ich denke Servlet-Dateien sollten von Ihrem Anwendungsserver bereitgestellt werden.

+0

Ich mache eine Maven bauen und das Ziel bereitstellen als: tomcat: run – Arun

+0

antwortete von Sotirios Delimanolis, das ist was genau ich wollte sagen. –

+0

org.springframework feder Kontext 3.2.3.RELEASE kompilieren entfernen die kompilieren und versuchen, ich mit meinem Arbeitsplatz pom pom die Ihr gerade bin im Vergleich. –

0

Behalten Sie den Bereich als "zur Verfügung gestellt" und versuchen Sie, diesen jar in tomcat/lib Ordnern zu behalten. Dies liegt daran, dass jeder Klassenlader der jeweiligen War-Klasse versucht, seine eigenen Servlet-api-Klassen getrennt zu laden, verglichen mit dem Anwendungsklassenlader, der die Servlet-API-Klassen auf Container-Ebene lädt.

Wenn Sie also das jar in CATALINA_HOME/lib verschieben können, benötigen Sie eine Menge von Klassen, die nur vom Anwendungsklassenlader geladen werden, und die gleiche Version wird von allen Kriegen verwendet. Der Bereich 'zur Verfügung gestellt' vermittelt dem Klassenladeprogramm auf Kriegsebene, dass die dafür erforderlichen Klassen bereits vom Anwendungsklassenlader geladen werden und besteht darauf, dass der Klassenladeprogramm auf seiner Kriegsebene keine separaten Instanzen oder Versionen für Klassen erzeugen muss Cast Exception

1

In Ihrem Fall scheint ClassCastException zu sein, weil Klassen durch verschiedene Klassenlader geladen werden. Nehmen wir an, Sie haben die servlet-api.jar versehentlich in Ihre WEB-INF/lib eingefügt und PARENT_LAST für Ihren Webapp-Klassenlader auf true gesetzt. Wenn Sie auf einem Anwendungsserver wie WAS laufen, bedeutet dies, dass Sie die Schnittstelle mit einem Klassenlader (einige Klassenlader oben) und der Implementierung (Servlet-API Jar nur ein Beispiel) mit einem anderen Klassenlader am unteren Rand laden.