programing

와일드플라이 스프링 부트 웹소켓

randomtip 2023. 3. 12. 21:09
반응형

와일드플라이 스프링 부트 웹소켓

안녕하세요. Wildfly 8.1에 Spring Boot 앱을 도입해야 하는데 다음과 같은 예외가 발생합니다.

원인: java.lang.Runtime Exception: java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer를 io.undertow에 캐스팅할 수 없습니다.websockets.jsr.io.undertow.servlet.core의 ServerWebSocketContainer.org.wildfly.extension.undertow.deploy(DeploymentManagerImpl.java:219).Undertow Deployment Service.startContext(Undertow Deployment Service).org.wildfly.display.undertow.deployment의 java:87)를 참조해 주세요.Undertow Deployment Service.start(Undertow Deployment Service).org.jboss.msc.service의 java:72)를 참조해 주세요.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2]Final.jar: 1.2.2.Final] org.jboss.msc.service로 송신됩니다.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2]Final.jar: 1.2.2.Final] ... 3 기타 원인: java.lang.ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer를 io.undertow에 캐스팅할 수 없습니다.websockets.jsr.io.undertow의 Server Web Socket Container.websockets.jsr.io.undertow.servlet.core의 Bootstrap$WebSocketListener.contextInitialized(Bootstrap.java:69)입니다.io.undertow.servlet.core의 ApplicationListeners.contextInitialized(ApplicationListeners.java:173)입니다.Deployment ManagerImpl.deploy(Deployment ManagerImpl.java:190)...7개 추가

웹소켓과 메시징 설정이 원인인 것 같습니다.이 https://github.com/joshlong/boot-examples/issues/2을 보고 있었는데, 제안해 주신 솔루션 중 어느 것도 제게는 효과가 없는 것 같습니다.다음은 내 pom의 의존관계입니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.6.RELEASE</version>
</parent>

<dependencies>

    <!--Testing-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${apache.httpcomponents.version}</version>
    </dependency>

    <!-- Spring -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-websocket</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-messaging</artifactId>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring4</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

    <!--Database-->
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901.jdbc4</version>
    </dependency>
</dependencies>

다이렉트 spring-boot-starter-websocket도 사용해 보았습니다만, 같은 것을 받았습니다.웹 소켓 구성도 다음과 같습니다.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    super.configureMessageBroker(registry);
    registry.enableSimpleBroker("/ssp");
    registry.setApplicationDestinationPrefixes("/inc");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/update/applications");
}
}

시간을 내어 읽어주셔서 감사합니다.어떤 도움이라도 주시면 감사하겠습니다.또, 이것은 나의 첫 기동 어플리케이션입니다.:/

tomcat-embedded-websocket 제외 필요

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

spring-boot-boot-web 및 spring-boot-websocket에는 기본적으로 spring-boot-websocket이 포함되어 있으므로 다음과 같이 Tomcat을 제외합니다.

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring-boot.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
        <version>${spring-boot.version}</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

classpath의 어디에 tomcat이 존재하지 않는지 확인합니다.

확실하지는 않지만 웹소켓에 관한 POM은 다음과 같습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-websocket</artifactId>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

spring-messaging,spring-websocket,jackson-databind,spring-boot-starter-web용장성이 있습니다.

또 있다spring-boot-starter-thymeleaf.

하지만 당신 원인의 근원은tomcat-embed-websocket.

다음 명령을 사용하여 다음을 포함하는 모든 종속성을 검색합니다.spring-boot-starter-tomcat:

mvn dependency:tree -Dincludes=org.springframework.boot:spring-boot-starter-tomcat

이 명령에 의해 나열된 모든 종속성에서 Tomcat starter를 제외합니다.

그 후 다음 추가가 필요할 수 있습니다.javax.servlet-api제공되는 의존관계로서:

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

이 문제가 있는 사용자를 그라데이션합니다. 티켓의 코멘트를 확인해 주세요.

spring-boot-starter-websocket 및 spring-boot-starter-web에는 기본적으로 spring-boot-starter-tomcat이 포함되어 있으므로 spring boot-starter-tomcat 버전을 사용하지 않고 다음과 같이 Tomcat을 제외합니다.

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

글쎄요, 위에서 제시한 어떤 해결책도 제게는 효과가 없었습니다.

문제의 원인은 실제로는 부모 버전입니다.

동작하지 않음:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

동작:

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

언급URL : https://stackoverflow.com/questions/25792121/spring-boot-websockets-in-wildfly

반응형