2013-07-22 24 views
7

Stworzyłem nowy projekt Wiosną MVC przy użyciu maven-eclipse i następujący błąd jest generowany:ClassCastException: DispatcherServlet nie mogą być oddane do Servlet

(próbowałem kilka rozwiązań z stackoverflow, który nie działa w moim przypadku. . niektóre problem z pom.xml które nie mogłem znaleźć dodałem pod warunkiem możliwości dla servlet-API i próbował który nie działa albo)

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

Moje pom.xml jest następująca:.

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

Moja web.xml wygląda następująco:

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

Odpowiedz

17

Zmień

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

do

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

provided ma ten opis:

ten jest bardzo podobny do kompilacji, ale wskazuje się spodziewać JDK lub pojemnik aby zapewnić zależność w czasie wykonywania. Na przykład, gdy zostanie utworzona aplikacja WWW dla środowiska Java Enterprise Edition, użytkownik będzie musiał ustawić zależność od interfejsu API serwletu i powiązanych interfejsów API Java EE na podany zakres, ponieważ kontener internetowy udostępnia te klasy. Ten zakres wynoszący jest dostępny tylko w ścieżce kompilacji i testowej klasy i nie jest przechodniowy .

z mavendocs. Zasadniczo mówisz Mavenowi, żeby dostarczył słoik do kompilacji, ale w czasie wykonywania użyj innego, kontenera serwletu, słoika.

+0

Zmieniłem to. Ale wciąż powoduje ten sam błąd. Czy muszę coś zmienić? – Arun

+0

@user Jaką wersję kontenera używasz? Spróbuj wyczyścić i odbudować swój projekt w Eclipse i Maven. –

+1

Nie jestem pewien, której wersji kontenera używam. Ale tak biegnę. Uruchamiam maven clean, maven install, a następnie robię maven build, dla którego dostarczam cel jako tomcat: run – Arun

0

Który serwer aplikacji używasz? Myślę, że pliki słoików serwletów powinny być dostarczone przez twój srver aplikacji.

+0

Wykonuję konstrukcję maven i przedstawiam cel: tomcat: uruchom – Arun

+0

, na który odpowiedział Sotirios Delimanolis, dokładnie to miałem na myśli. –

+0

org.springframework wiosna-context 3.2.3.RELEASE skompilować usunąć skompilować i spróbować, ja po prostu porównując swoją pom pom z mojego obszaru roboczego. –

0

Zachowaj zakres jako "dostarczony" i spróbuj zachować ten jar w folderach tomcat/lib. Dzieje się tak dlatego, że każdy moduł ładujący klasy danej wojny próbuje załadować osobno własne klasy Servlet-api, w porównaniu do programu ładującego klasy aplikacji, który ładuje klasy Servlet-api na poziomie kontenera.

Więc jeśli możesz doprowadzić słoik przeniesiony do katalogu CATALINA_HOME/lib. Masz wymagany zestaw klas ładowanych przez program ładujący klasy aplikacji i ta sama wersja będzie odesłana przez wszystkie wojny.

"Dostarczony" zakres przekazuje do programu ładującego klasy na poziomie wojny, że wymagane do tego klasy są już ładowane przez moduł ładujący klasy aplikacji i nalega, aby program ładujący klasy na swoim poziomie wojny nie musiał tworzyć osobnych wystąpień lub wersji dla niego powodujących wyjątek odlewania

1

W twoim przypadku wyjątek ClassCastException wynika z tego, że klasy są ładowane przez różne programy ładujące klasy. Powiedzmy, że aplet-api.jar został włączony przez pomyłkę do twojej WEB-INF/lib i ustawiłeś PARENT_LAST true dla twojego programu ładującego klasy webapp. Jeśli korzystasz z serwera aplikacji, takiego jak WAS, oznacza to, że ładujesz interfejs za pomocą jednego programu ładującego klasy (jakiś program ładujący klasy na górze) i implementacji (słoik servlet-api po prostu np.) Z innym programem ładującym klasy na dole.

Powiązane problemy