我正在尝试开发一个使用websocket端点的Java EE 7 Web应用程序,并将其部署在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 /游戏?我已经找到了一些映射servlet的例子,但我认为这不适用于服务器端点。
或者,有没有办法为Jetty编写web.xml文件,以便它自动发现ll带注释的类/方法(类似于上面的beans.xml)
答案 0 :(得分:8)
假设您使用JSR-356技术注释game.WebSocketEndpoint
...
示例:
package game;
import javax.websocket.server.ServerEndpoint
@ServerEndpoint("/game")
public class 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是快速启动。
如何手动添加端点
// 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);