2013-11-21 60 views
5

我正在嘗試開發一個使用websocket端點並將其部署到Jetty服務器上的Java EE 7 Web應用程序。在web.xml文件中映射WebSocketEndpoints

該應用程序的結構如下:

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的示例,但我認爲這不適用於服務器端點。

或者,有沒有寫碼頭web.xml文件的方式,以便它可以自動發現LL註解的類/方法(類似於上述的beans.xml)

回答

5

假設你已經使用JSR註解game.WebSocketEndpoint -356技術...

例子:

package game; 

import javax.websocket.server.ServerEndpoint 

@ServerEndpoint("/game") 
public class WebSocketEndpoint { 

} 

然後,你必須做到以下幾點...

  1. 使用​​
  2. Enable the 'websocket' module(添加--module=websocketstart.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); 
+0

什麼有關其它容器?我喜歡手動配置,但是我發現讓人難以置信的是,互聯網上沒有人提到如何讓你的contianer(tomcat 8)檢測到嚴重點。沒有通用的方法嗎?我不喜歡容器特定的解決方案。 – momomo