2013-11-21 3 views
5

Я пытаюсь разработать веб-приложение Java EE 7, которое использует конечную точку websocket и развертывает ее на сервере Jetty.Сопоставление WebSocketEndpoints в файле web.xml

Приложение имеет следующую структуру:

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.

Итак, мой вопрос - Как сопоставить конечную точку веб-узла с URL/игрой в файле web.xml? Я нашел несколько примеров для сопоставления сервлетов, но я не думаю, что это будет работать для конечной точки сервера.

Или, есть ли способ, чтобы написать файл web.xml для Jetty так, чтобы он автоматически обнаруживает Л.Л. аннотированные классы/методы (аналогично приведенному выше beans.xml)

ответ

5

Предполагая, что вы аннотированный game.WebSocketEndpoint с помощью JSR -356 методы ...

Пример:

package game; 

import javax.websocket.server.ServerEndpoint 

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

} 

Тогда вы должны сделать следующее ...

  1. Использование Jetty 9.1+
  2. Enable the 'websocket' module (добавить --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 - быстрый запуск.

Как вручную добавить Endpoints

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

Смежные вопросы