복붙노트

[SPRING] ClassCastException : DispatcherServlet을 Servlet에 캐스트 할 수 없습니다.

SPRING

ClassCastException : DispatcherServlet을 Servlet에 캐스트 할 수 없습니다.

maven-eclipse를 사용하여 새로운 Spring MVC 프로젝트를 만들었으며 다음과 같은 오류가 발생합니다.

(내 경우에는 작동하지 않는 stackoverflow 일부 솔루션을 시도했다. 찾을 수없는 pom.xml 일부 문제가 있습니다. servlet-api 제공된 범위를 추가하고 어느 쪽도 작동하지 않았습니다.)

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

내 pom.xml은 다음과 같습니다.

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

내 web.xml은 다음과 같습니다.

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

해결법

  1. ==============================

    1.변화

    변화

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

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

    제공되는 설명 :

    maven 문서에서. 기본적으로 Maven에게 컴파일을 위해 jar 파일을 제공한다고 알려주지 만, 런타임에는 서블릿 컨테이너의 jar 파일을 사용한다.

  2. ==============================

    2.귀하의 경우 ClassCastException 다른 클래스 로더에 의해로드되는 클래스로 인해 것 같다. 말하자면, 실수로 servlet-api.jar를 WEB-INF / lib에 포함 시켰고 webapp 클래스 로더에 PARENT_LAST를 true로 설정했습니다. WAS와 같은 응용 프로그램 서버에서 실행중인 경우 맨 아래에 다른 클래스 로더가있는 클래스 로더 (상단의 일부 클래스 로더)와 구현 (예 : 예 : servlet-api jar) 인터페이스를로드하고 있음을 의미합니다.

    귀하의 경우 ClassCastException 다른 클래스 로더에 의해로드되는 클래스로 인해 것 같다. 말하자면, 실수로 servlet-api.jar를 WEB-INF / lib에 포함 시켰고 webapp 클래스 로더에 PARENT_LAST를 true로 설정했습니다. WAS와 같은 응용 프로그램 서버에서 실행중인 경우 맨 아래에 다른 클래스 로더가있는 클래스 로더 (상단의 일부 클래스 로더)와 구현 (예 : 예 : servlet-api jar) 인터페이스를로드하고 있음을 의미합니다.

  3. ==============================

    3.어떤 응용 프로그램 서버를 사용하고 있습니까? 서블릿 jars 파일은 응용 프로그램 srver에 의해 제공되어야한다고 생각합니다.

    어떤 응용 프로그램 서버를 사용하고 있습니까? 서블릿 jars 파일은 응용 프로그램 srver에 의해 제공되어야한다고 생각합니다.

  4. ==============================

    4.범위를 '제공됨'으로 유지하고 jcat을 tomcat / lib 폴더에 보관하십시오. 이것은 각 war의 각 클래스 로더가 컨테이너 수준에서 Servlet-api 클래스를로드하는 응용 프로그램 클래스 로더와 비교하여 자체 Servlet-api 클래스를 개별적으로로드하려고하기 때문입니다.

    범위를 '제공됨'으로 유지하고 jcat을 tomcat / lib 폴더에 보관하십시오. 이것은 각 war의 각 클래스 로더가 컨테이너 수준에서 Servlet-api 클래스를로드하는 응용 프로그램 클래스 로더와 비교하여 자체 Servlet-api 클래스를 개별적으로로드하려고하기 때문입니다.

    따라서 u가 CATALINA_HOME / lib로 이동되도록 만들 수 있다면 응용 프로그램 클래스 로더에 의해로드 된 클래스 세트 만 필요하며 모든 버전에서 동일한 버전이 참조됩니다.

    '제공된'스코프는 클래스 레벨에있는 클래스 로더에게 전달됩니다.이 클래스에 필요한 클래스는 이미 애플리케이션 클래스 로더에 의해로드되고 클래스 로더는 클래스 레벨에서 클래스 캐스팅 예외를 발생시키는 별도의 인스턴스 또는 버전을 만들 필요가 없다고 주장합니다.

  5. from https://stackoverflow.com/questions/17799295/classcastexception-dispatcherservlet-cannot-be-cast-to-servlet by cc-by-sa and MIT license