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
相关产品推荐
相关产品推荐

