当前位置: 首页 > 知识库问答 >
问题:

Wildfly中的Spring Boot Websockets

邵宜年
2023-03-14

您好,我需要将我的Spring Boot应用程序部署到Wildfly 8.1中,我遇到以下异常:

原因:java。RuntimeException:java。lang.ClassCastException:组织。阿帕奇。公猫websocket。服务器WsServerContainer无法转换为io。下拖。websockets。jsr。io上的ServerWebSocketContainer。下拖。servlet。果心DeploymentManagerImpl。在组织上部署(DeploymentManagerImpl.java:219)。野蝇。扩大下拖。部署。在部署服务下。位于org的startContext(UndertowDeploymentService.java:87)。野蝇。扩大下拖。部署。在部署服务下。在org上启动(UndertowDeploymentService.java:72)。jboss。理学硕士。服务ServiceControllerImpl$StartTask。startService(ServiceControllerImpl.java:1948)[jboss-msc-1.2.2.Final.jar:1.2.2.Final]位于org。jboss。理学硕士。服务ServiceControllerImpl$StartTask。运行(ServiceControllerImpl.java:1881)[jboss-msc-1.2.2.Final.jar:1.2.2.Final]。。。3更多原因:java。lang.ClassCastException:组织。阿帕奇。公猫websocket。服务器WsServerContainer无法转换为io。下拖。websockets。jsr。io上的ServerWebSocketContainer。下拖。websockets。jsr。Bootstrap$WebSocketListener。contextInitialized(Bootstrap.java:69)位于io。下拖。servlet。果心应用程序侦听器。contextInitialized(ApplicationListeners.java:173)位于io。下拖。servlet。果心DeploymentManagerImpl。部署(DeploymentManagerImpl.java:190)。。。7个以上

似乎我的webockets和消息传递设置可能是罪魁祸首?我正在看这个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>

我也尝试过使用direct spring boot starter websocket,但得到了同样的结果。这也是我的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");
}
}

感谢您抽出时间阅读本文。我将不胜感激。此外,这是我的第一个启动应用程序。:/

共有3个答案

缑勇锐
2023-03-14

我不确定,但您在websockets周围的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启动装置thymeleaf。

然而,我认为您的原因是tomcat嵌入websocket。

景光赫
2023-03-14

spring-boot-starter-web和spring-boot-starter-websocket默认包含spring-boot-starter-tomcat,因此排除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>

并包括undertow,确保tomcat在类路径中不存在。

桂玉石
2023-03-14

你需要排除tomcat-embed-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>
 类似资料:
  • 考虑下面的结构:代码> JBASS部署结构。ear的xml内部 鉴于此,我排除了default部署模块(第11行)和部署自定义位于文件夹或ear中。我还为子部署。 xerces类将从何处加载?从WildFly的默认模块或部署在中的自定义jar? 在子部署中添加路径依赖项的确切含义是什么?这会忽略主部署下的排除(即,org.apache.xerces)吗?

  • WildFly,原名 JBoss AS(JBoss Application Server) 或者 JBoss,是一套应用程序服务器,属于开源的企业级 Java 中间件软件,用于实现基于 SOA 架构的 Web 应用和服务。 WildFly 包含一组可独立运行的软件。 WildFly采用积极的方法进行内存管理。开发基本运行时服务是为了最大程度地减少堆分配。这些服务在重复的完整解析中使用公共的缓存索引

  • 我正在使用Java8构建我的应用程序,并计划使用JBoss EAP 7.1.0进行生产部署,但我没有得到JBoss EAP 7.1.0附带的Wildfly版本。我找到了Wildfly核心3.0.1,但什么是Wildfly核心? 还建议将JBoss EAP 6.4的Java版本更新到Java8并使用它吗?

  • 我的所有应用程序文件都是使用UTF-8创建的,但WildFly将它们作为ISO-8859-1提供服务。 null

  • 我想在处理不同的回调时,主体应该由ServerAuthenticationContext创建,对吗? 如何管理SimpleSecurityManager能够识别主体,是否需要在身份验证机制中创建主体,以及如何创建主体?

  • WildFly Monitor 是 WildFly 的一个子系统,可以将收集的 WildFly 监控和统计数据发送到 RHQ Metrics 服务器。