복붙노트

[SPRING] 핸들러가 호출되기 전에 Tomcat 8 및 Spring 4가있는 웹 소켓 ClassCastException

SPRING

핸들러가 호출되기 전에 Tomcat 8 및 Spring 4가있는 웹 소켓 ClassCastException

내 응용 프로그램에 통합하기 위해 작동하는 간단한 websocket을 얻으려고합니다. 그러나 Spring API로 작동하도록 ClassCastException 어딘가에 처리기가 호출되기 전에 Tomcat 형식을 javax 객체로 변환하려고 시도하지 못했습니다. Tomcat을 Spring없이 직접 사용한다면 (그래서 javax.websocket 객체와 annotation) 완벽하게 작동하기 때문에 Spring과 관련된 문제가 정말로 확실하지 않습니다.

08-May-2014 01:10:12.048 SEVERE [http-nio-8084-exec-88] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [/WebsocketSpringTest] threw exception [Request processing failed; nested exception is org.springframework.web.socket.server.HandshakeFailureException: Uncaught failure for request http://localhost:8084/WebsocketSpringTest/socket; nested exception is java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer] with root cause
java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer
at org.springframework.web.socket.server.standard.AbstractStandardUpgradeStrategy.getContainer(AbstractStandardUpgradeStrategy.java:67)

TestSocket.java

import org.springframework.web.socket.WebSocketHandler;
public class TestSocket implements WebSocketHandler {
    ...

을 포함한다.

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

dispatcher-servlet.xml

<context:component-scan base-package="com.willnewbery.websocketspringtest" />
<context:annotation-config />
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
        p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
<websocket:handlers>
    <websocket:mapping path="/socket" handler="socket"/>
</websocket:handlers>
<bean id="socket" class="com.willnewbery.websocketspringtest.TestSocket"/>

Pom.hml

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>4.0.4.RELEASE</spring.version>
    <tomcat.version>8.0.3</tomcat.version>
</properties>

<dependencies>
    <!--javax-->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.websocket</groupId>
        <artifactId>javax.websocket-api</artifactId>
        <version>1.0</version>
    </dependency>
    <!--spring-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-websocket</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!--tomcat-->
</dependencies>

해결법

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

    1."javax.websocket-api"종속성이 문제 일 수 있습니다. 이미 서버 lib에 포함되어 있기 때문에 적어도 "제공된"범위로 만들거나 제거하려고 시도하면 응용 프로그램 pom에 필요하지 않은 좋은 기회가 있습니다.

    "javax.websocket-api"종속성이 문제 일 수 있습니다. 이미 서버 lib에 포함되어 있기 때문에 적어도 "제공된"범위로 만들거나 제거하려고 시도하면 응용 프로그램 pom에 필요하지 않은 좋은 기회가 있습니다.

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

    2.spring-boot-starter-web에서 tomcat-embed-websocket 종속성을 제외합니다.

    spring-boot-starter-web에서 tomcat-embed-websocket 종속성을 제외합니다.

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <exclusions>
                    <exclusion>
                        <artifactId>tomcat-embed-logging-juli</artifactId>
                        <groupId>org.apache.tomcat.embed</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>tomcat-embed-websocket</artifactId>
                        <groupId>org.apache.tomcat.embed</groupId>
                    </exclusion>
                    <exclusion>
                        <artifactId>tomcat-embed-el</artifactId>
                        <groupId>org.apache.tomcat.embed</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    
  3. ==============================

    3.war 파일에서 tomcat-embed-websocket - *. jar를 제외해야합니다.

    war 파일에서 tomcat-embed-websocket - *. jar를 제외해야합니다.

    이 줄을 build.gradle에 추가하십시오.

    providedCompile("org.apache.tomcat.embed:tomcat-embed-websocket")
    

    또는 Maven :

     <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>${tomcat.version}</version>
     </dependency>
    
  4. ==============================

    4.Spring Boot로 WAR 파일을 빌드 할 때 참조 문서는 Tomcat을 제공된 종속성으로 전환해야한다고 지적합니다. Maven과 Gradle 모두에 대한 권장 사례는 여기에서 참조 문서 => http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war- 파일

    Spring Boot로 WAR 파일을 빌드 할 때 참조 문서는 Tomcat을 제공된 종속성으로 전환해야한다고 지적합니다. Maven과 Gradle 모두에 대한 권장 사례는 여기에서 참조 문서 => http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war- 파일

  5. from https://stackoverflow.com/questions/23530654/websockets-with-tomcat-8-and-spring-4-classcastexception-before-handler-is-invok by cc-by-sa and MIT license