2013-11-21 19 views
5

Próbuję utworzyć aplikację WWW Java EE 7, która korzysta z punktu końcowego WebSocket i wdraża go na serwerze Jetty.Mapowanie WebSocketEndpoints w pliku web.xml

Aplikacja posiada następującą strukturę:

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

W pliku 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 jest prawidłowo uwagami i współpracuje z Netbeans/Glassfish4 jednak, aplikacja musi zostać wdrożona na serwerze Jetty.

Moje pytanie - jak odwzorować punkt końcowy websocket na URL/grę w pliku web.xml? Znalazłem wiele przykładów mapowania serwletów, ale nie sądzę, że będzie to działać dla punktu końcowego serwera.

Albo, czy jest jakiś sposób, aby zapisać plik web.xml dla Jetty tak, że automatycznie wykrywa ll adnotacjami klas/metod (podobny do powyższego beans.xml)

Odpowiedz

5

Zakładając, że odnotowany game.WebSocketEndpoint pomocą JSR -356 techniki ...

Przykład:

package game; 

import javax.websocket.server.ServerEndpoint 

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

} 

Następnie trzeba wykonać następujące czynności ...

  1. Zastosowanie Jetty 9.1+
  2. Enable the 'websocket' module (dodaj --module=websocket do linii poleceń lub start.ini)

To pozwoli klas serwerów websocket + skanowanie adnotacji dla końcowych websocket.

Uwaga: JSR-356 nie jest mapowany za pomocą deskryptora wdrażania (web.xml).

Jednak można programowo mapowania punktów końcowych przy użyciu jednej z następujących technik:

  1. Tworzenie javax.servlet.ServletContextListener że ręcznie dodaje punktów końcowych za pośrednictwem javax.websocket.server.ServerContainer (patrz poniżej jak)
  2. Tworzenie javax.servlet.ServerContainerInitializer że ręcznie dodaje Punkty końcowe za pośrednictwem javax.websocket.server.ServerContainer (zobacz poniżej)
  3. Utwórz javax.websocket.server.ServerAppliationConfig, który zwraca punkty końcowe, które chcesz dodać.

Uwaga: technika # 2 i # 3 wymagają skanowania klas dla adnotacji (powolne uruchamianie). technika # 1 to szybki start.

Jak ręcznie dodać punktów końcowych

// 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

co dla innych pojemników?Podoba mi się ręczna konfiguracja, ale uważam za niewiarygodne, że nie ma w Internecie czy ktoś wspomniał, jak uzyskać contianer (tomcat 8), aby wykryć poważne punkty. Czy nie ma ogólnego sposobu? Nie lubię rozwiązań specyficznych dla kontenerów. – momomo