You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JBoss 7.4中WebSocket接口抽离外部依赖后无法生效的解决方法问询

问题描述

按照JBoss 7.4官方文档,通过注解定义WebSocket服务的常规写法如下:

@ServerEndpoint("/websocket/helloworld")
public class MyService {

    @OnMessage
    String sayHello(String name){ ... };

    @OnOpen
    void helloOnOpen(Session session){ ... };

    @OnClose
    void helloOnClose(CloseReason reason){ ... };

}

希望将WebSocket契约定义在外部依赖(如chat-api)的接口中,再引入依赖到实现项目:
chat-api中的接口定义:

@ServerEndpoint("/websocket/helloworld")
public interface MyServiceInterface {

    @OnMessage
    String sayHello(String name);

    @OnOpen
    void helloOnOpen(Session session);

    @OnClose
    void helloOnClose(CloseReason reason);

}

实现项目中的实现类:

public class MyServiceImpl implements MyServiceInterface {

    @Override
    String sayHello(String name){ ... };

    @Override
    void helloOnOpen(Session session){ ... };

    @Override
    void helloOnClose(CloseReason reason){ ... };

}

但采用该方式时,Wildfly无法识别并处理此WebSocket服务,导致功能失效,需要可行的配置方案。

可行配置方案

方案一:在实现类上补全WebSocket注解

Wildfly的WebSocket扫描器仅识别类级别的@ServerEndpoint注解,且JSR-356规范中的@OnMessage、@OnOpen等方法级注解不具备继承性(接口上的注解不会自动传递给实现类方法),因此需要在实现类上显式添加相关注解:

@ServerEndpoint("/websocket/helloworld")
public class MyServiceImpl implements MyServiceInterface {

    @Override
    @OnMessage
    public String sayHello(String name){ 
        // 业务实现逻辑
    };

    @Override
    @OnOpen
    public void helloOnOpen(Session session){ 
        // 连接打开时的逻辑
    };

    @Override
    @OnClose
    public void helloOnClose(CloseReason reason){ 
        // 连接关闭时的逻辑
    };

}

此方式让Wildfly能直接扫描到实现类上的端点注解,同时方法上的注解明确标记了WebSocket事件处理逻辑,可正常完成服务注册。

方案二:通过Wildfly部署描述符手动注册端点

若不想在实现类上重复添加注解,可通过Wildfly专属的部署描述符WEB-INF/jboss-websockets.xml显式配置WebSocket端点:
创建WEB-INF/jboss-websockets.xml文件,内容如下:

<websockets xmlns="http://www.jboss.com/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/schema/jbossas/jboss-websockets_1_0.xsd">
    <endpoint>
        <url-pattern>/websocket/helloworld</url-pattern>
        <endpoint-class>com.yourpackage.MyServiceImpl</endpoint-class>
    </endpoint>
</websockets>

同时需确保实现类的重写方法上添加对应的@OnMessage、@OnOpen、@OnClose注解(容器仍需识别方法对应的WebSocket事件),接口上的@ServerEndpoint注解可保留作为契约标识,但不会被Wildfly扫描使用。


内容的提问来源于stack exchange,提问作者quindimildev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:52:45