2013-07-22 15 views
7

ho creato un nuovo progetto Spring MVC utilizzando Maven-eclisse e il seguente errore viene generato:ClassCastException: DispatcherServlet non può essere lanciato per Servlet

(ho provato alcune soluzioni dalla StackOverflow che non funziona nel mio caso. . Qualche problema con il pom.xml che non sono riuscito a trovare ho aggiunto fornito spazio per il servlet-api e ha cercato che non funzionava neanche)

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

mio pom.xml è la seguente:.

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

mio web.xml è la seguente:

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

risposta

17

Change

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

a

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

provided ha questa descrizione:

Questo è molto simile in fase di compilazione, ma indica che ci si aspetta il JDK o un contenitore per fornire il dipendenza al runtime. Ad esempio, quando crea un'applicazione Web per Java Enterprise Edition, è necessario impostare la dipendenza dall'API Servlet e le API Java EE correlate all'ambito fornito poiché il contenitore Web fornisce tali classi. Questo ambito è disponibile solo sul percorso di classe di compilation e test ed è non transitivo.

da mavendocs. In pratica stai dicendo a Maven di fornire il vaso per la compilazione, ma, in fase di esecuzione, usa un altro contenitore, il contenitore del servlet.

+0

L'ho cambiato. Ma ancora getta lo stesso errore. Devo cambiare qualcosa? – Arun

+0

@user In quale versione del contenitore ci si trova? Prova a pulire e ricostruire il tuo progetto in Eclipse e con Maven. –

+1

Non sono sicuro di quale versione del contenitore sto usando. Ma questo è il modo in cui corro. Eseguo maven clean, installazione di maven e poi faccio un build di maven per il quale fornisco l'obiettivo come tomcat: run – Arun

0

Quale server di applicazione che si sta utilizzando? Penso che i file jar di Servlet debbano essere forniti dallo srver dell'applicazione.

+0

Faccio una build maven e fornisco l'obiettivo come: tomcat: run – Arun

+0

risposto da Sotirios Delimanolis, questo è esattamente ciò che intendevo dire. –

+0

org.springframework primavera-contesto 3.2.3.RELEASE compilare rimuovere il compilazione e cercare, sto solo confrontando il vostro pom pom con il mio lavoro. –

0

Mantieni l'ambito come "fornito" e prova a conservare quel vaso nelle cartelle tomcat/lib. Ciò è dovuto al fatto che ciascun programma di caricamento classi di rispettivi war tenta di caricare separatamente le proprie classi Servlet-api, rispetto al programma di caricamento classi dell'applicazione che carica le classi Servlet-api a livello di contenitore.

Quindi, se è possibile spostare il vaso su CATALINA_HOME/lib.si ha richiesto un set di classi caricate dal caricatore di classi di applicazioni e la stessa versione verrà riferita da tutte le guerre.

l'ambito "fornito" trasmette al caricatore di classi a livello di guerra che le classi richieste per questo sono già caricate dal caricatore di classi di applicazioni e insiste che il programma di caricamento classi al suo livello di guerra non sia necessario per creare istanze o versioni separate per quella classe di cause cast exception

1

Nel tuo caso, ClassCastException sembra essere dovuto alle classi caricate da diversi classloader. Supponiamo che tu abbia il servlet-api.jar incluso per errore nel tuo WEB-INF/lib e tu abbia impostato PARENT_LAST true per il tuo caricatore di classe webapp. Se si sta utilizzando un server delle applicazioni come WAS, ciò significherebbe che si sta caricando l'interfaccia con un caricatore di classe (un caricatore di classi nella parte superiore) e un'implementazione (jar servlet-API solo un esempio) con un altro caricatore di classi nella parte inferiore.

Problemi correlati