Java 在web.xml文件中映射WebSocketEndpoints

Java 在web.xml文件中映射WebSocketEndpoints,java,jakarta-ee,web-applications,jetty,java-ee-7,Java,Jakarta Ee,Web Applications,Jetty,Java Ee 7,我正在尝试开发一个使用websocket端点的JavaEE7Web应用程序,并将其部署在Jetty服务器上 该应用程序具有以下结构: Game/ src/ main/ java/ game/ WebSocketEndpoint.java webapp/ index.html scripts/ variousjavascriptstuff.js WEB-INF

我正在尝试开发一个使用websocket端点的JavaEE7Web应用程序,并将其部署在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)

假设您已经使用JSR-356技术注释了
game.WebSocketEndpoint

例如:

打包游戏;
导入javax.websocket.server.ServerEndpoint
@ServerEndpoint(“/game”)
公共类WebSocketEndpoint{
}
然后你必须做以下事情

  • 使用
  • (将
    --module=websocket
    添加到
    start.ini
    或命令行)
  • 这将为websocket端点启用websocket服务器类+注释扫描

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

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

  • 创建一个
    javax.servlet.ServletContextListener
    ,它通过
    javax.websocket.server.ServerContainer
    手动添加端点(方法见下文)
  • 创建一个
    javax.servlet.ServerContainerInitializer
    ,它通过
    javax.websocket.server.ServerContainer
    手动添加端点(方法见下文)
  • 创建一个
    javax.websocket.server.ServerAppliationConfig
    ,返回要添加的端点
  • 注意:技巧2和技巧3都需要对注释进行类扫描(启动缓慢)。技术1是快速启动

    如何手动添加端点

    //获取对ServerContainer的引用
    javax.websocket.server.ServerContainer服务器容器=
    (javax.websocket.server.ServerContainer)
    getAttribute(“javax.websocket.server.ServerContainer”);
    //将端点手动添加到服务器容器
    addEndpoint(game.WebSocketEndpoint.class);
    
    其他集装箱的情况如何?我喜欢手动配置,但我发现令人难以置信的是,没有人在互联网上提到如何让你的控制器(tomcat 8)检测服务器端点。难道没有通用的方法吗?我不喜欢特定于容器的解决方案。上面的代码片段也适用于Tomcat8.5(可能也适用于其他Tomcats)。在
    javax.websocket.server.ServerContainer
    的javadoc中提到,这是访问“启用websocket的web容器”的
    ServerContainer
    的标准过程(例如,请参见此处:)