在web.xml文件中映射WebSocket终端点

6
我将尝试开发一个Java EE 7的Web应用程序,其中使用了WebSocket端点,并将其部署在Jetty服务器上。
该应用程序具有以下结构:
Game/
  src/
    main/
      java/
        game/
          WebSocketEndpoint.java
      webapp/
        index.html
        scripts/
          variousjavascriptstuff.js
        WEB-INF/
          beans.xml
          web.xml

在beans.xml文件中:

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
   bean-discovery-mode="annotated">

WebSocketEndpoint已经正确注释,并在Netbeans/Glassfish4上运作良好,然而,该应用程序必须部署在Jetty服务器上。
因此,我的问题是 - 如何将websocket端点映射到web.xml文件中的URL /game?我找到了许多映射servlet的示例,但我不认为这适用于服务器端点。
或者,是否有一种方法可以为Jetty编写一个web.xml文件,使其自动发现所有已注释的类/方法(类似于上述的beans.xml)?
1个回答

9
假设您已经使用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);

其他容器怎么办?我喜欢手动配置,但是我觉得很难理解的是,在互联网上没有人提到如何让你的容器(Tomcat 8)检测到服务器端点。难道没有通用的方法吗?我不喜欢特定于容器的解决方案。 - mjs
1
上面的代码片段在Tomcat 8.5中也可以工作(可能也适用于其他版本的Tomcat)。在javax.websocket.server.ServerContainer的javadoc中,提到这是一种访问“启用websocket的Web容器”的ServerContainer的标准过程(例如,请参见:https://github.com/eclipse-ee4j/websocket-api/blob/master/api/server/src/main/java/javax/websocket/server/ServerContainer.java)。 - Remigius Stalder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接