在web.xml文件中映射WebSocketEndpoints

我正在尝试开发一个使用websocket端点并将其部署在Jetty服务器上的Java EE 7 Web应用程序。

该应用程序具有以下结构:

Game/ src/ main/ java/ game/ WebSocketEndpoint.java webapp/ index.html scripts/ variousjavascriptstuff.js WEB-INF/ beans.xml web.xml 

在beans.xml文件中:

  

WebSocketEndpoint已正确注释,并且可以与Netbeans / Glassfish4一起使用,但是,应用程序必须部署在Jetty服务器上。

所以,我的问题 – 如何将websocket端点映射到web.xml文件中的URL /游戏? 我已经找到了一些映射servlet的例子,但我认为这不适用于服务器端点。

或者,有没有办法为Jetty编写web.xml文件,以便它自动发现ll带注释的类/方法(类似于上面的beans.xml)

假设你使用JSR-356技术注释了game.WebSocketEndpoint ……

例:

 package game; import javax.websocket.server.ServerEndpoint @ServerEndpoint("/game") public class WebSocketEndpoint { } 

然后你必须做以下事情……

  1. 使用Jetty 9.1+
  2. 启用’websocket’模块 (将--module=websocket添加到start.ini或命令行)

这将使websocket服务器类+注释扫描websocket端点。

注意:JSR-356并不意味着通过部署描述符( web.xml )进行映射。

但是,您可以使用以下方法之一以编程方式映射端点:

  1. 创建一个javax.servlet.ServletContextListener ,通过javax.websocket.server.ServerContainer手动添加端点(参见下面的方法)
  2. 创建一个javax.servlet.ServerContainerInitializer ,通过javax.websocket.server.ServerContainer手动添加端点(参见下面的方法)
  3. 创建一个返回要添加的端点的javax.websocket.server.ServerAppliationConfig

注意:技术#2和#3都需要类扫描注释(慢启动)。 技术#1是快速启动。

如何手动添加端点

 // Get a reference to the ServerContainer javax.websocket.server.ServerContainer ServerContainer = (javax.websocket.server.ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer"); // Add endpoint manually to server container serverContainer.addEndpoint(game.WebSocketEndpoint.class);