[SPRING] ClassCastException : DispatcherServlet을 Servlet에 캐스트 할 수 없습니다.
SPRINGClassCastException : 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.변화
변화
<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.귀하의 경우 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.어떤 응용 프로그램 서버를 사용하고 있습니까? 서블릿 jars 파일은 응용 프로그램 srver에 의해 제공되어야한다고 생각합니다.
어떤 응용 프로그램 서버를 사용하고 있습니까? 서블릿 jars 파일은 응용 프로그램 srver에 의해 제공되어야한다고 생각합니다.
-
==============================
4.범위를 '제공됨'으로 유지하고 jcat을 tomcat / lib 폴더에 보관하십시오. 이것은 각 war의 각 클래스 로더가 컨테이너 수준에서 Servlet-api 클래스를로드하는 응용 프로그램 클래스 로더와 비교하여 자체 Servlet-api 클래스를 개별적으로로드하려고하기 때문입니다.
범위를 '제공됨'으로 유지하고 jcat을 tomcat / lib 폴더에 보관하십시오. 이것은 각 war의 각 클래스 로더가 컨테이너 수준에서 Servlet-api 클래스를로드하는 응용 프로그램 클래스 로더와 비교하여 자체 Servlet-api 클래스를 개별적으로로드하려고하기 때문입니다.
따라서 u가 CATALINA_HOME / lib로 이동되도록 만들 수 있다면 응용 프로그램 클래스 로더에 의해로드 된 클래스 세트 만 필요하며 모든 버전에서 동일한 버전이 참조됩니다.
'제공된'스코프는 클래스 레벨에있는 클래스 로더에게 전달됩니다.이 클래스에 필요한 클래스는 이미 애플리케이션 클래스 로더에 의해로드되고 클래스 로더는 클래스 레벨에서 클래스 캐스팅 예외를 발생시키는 별도의 인스턴스 또는 버전을 만들 필요가 없다고 주장합니다.
from https://stackoverflow.com/questions/17799295/classcastexception-dispatcherservlet-cannot-be-cast-to-servlet by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Framework에서 setter가 어떻게 작동합니까? (0) | 2019.07.16 |
---|---|
[SPRING] Spring 어노테이션에서 정적 변수 사용하기 (0) | 2019.07.16 |
[SPRING] onedrive에 파일을 업로드 할 때 Java 코드를 트리거하여 onedrive에서 파일을 다운로드하십시오. (0) | 2019.07.16 |
[SPRING] @Transactional 주석이있는 여러 트랜잭션 관리자 (0) | 2019.07.16 |
[SPRING] 스프링 데이터를 사용하는 동안 테이블 이름을 매개 변수의 값으로 바꾸는 방법 JPA nativeQuery (0) | 2019.07.16 |