ClassCastException: DispatcherServlet cannot be passed to the servlet

I created a new Spring MVC project using maven-eclipse and the following error is raised:

(I tried some solutions from stackoverflow, which does not work in my case. Some problem with pom.xml that I could not find. I added the provided scope for servlet-api and tried, which also did not work.)

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

My pom.xml looks like this:

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

My web.xml is as follows:

 <?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> 
+7
java spring maven servlets
source share
4 answers

Change

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

to

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

provided has the following description:

This is very similar to compilation, but indicates that you expect the JDK or container to provide runtime dependency. For example, when creating a web application for Java Enterprise Edition, you would establish a dependency on the servlet API and its associated Java EE APIs for the scope because the web container provides these classes. This scope is only available in the compilation and non-transitive way.

from maven docs . You basically tell Maven to provide the jar for compilation, but at runtime use a different servlet container container.

+17
source share

In your case, a ClassCastException seems to be related to the fact that classes are loaded by different class loaders. Say you have a servlet-api.jar included by mistake in your WEB-INF / lib, and you set PARENT_LAST true for your webapp class loader. If you are working on an application server such as WAS, this means that you are loading an interface with one classloader (some classloader at the top) and an implementation (e.g. servlet-api jar) with another classloader at the bottom.

+1
source share

Which application server are you using? I think servlet file files should be provided by your application.

0
source share

Save the area as "provided" and try to save this jar in the tomcat / lib folders. This is because each class loader of the corresponding war tries to load its own Servlet-api classes separately, compared to the application class loader, which loads the Servlet-api classes at the container level.

So, if u can make jar move to CATALINA_HOME / lib.you, a set of classes is required that are loaded by the application class loader, and the same version will be passed in all wars.

scope "provided" tells the class loader at the war level that the classes required for this are already loaded by the application class loader and insists that the class loader at its military level may not be needed to create separate instances or versions for it that cause the class to throw an exception

0
source share

All Articles