Программная конечная точка сервера Tyrus WebSocket

Я пытаюсь создать сервер веб-сокетов, используя программные конечные точки с tyrus 1.8.2. Я обнаружил, что конструктор:

public Server(String hostName,
  int port,
  String contextPath,
  Map<String,Object> properties,
  Class<?>... configuration)

не принимает класс, реализующий ServerEndpointConfig. Когда я пытаюсь это сделать, он выдает исключение DeploymentException «Класс XXX не является потомком ServerApplicationConfig и не имеет аннотации @ServerEndpoint».

Поскольку я использую программные конечные точки (без аннотаций), это, по-видимому, означает, что я должен реализовать ServerApplicationConfig. Это противоречит документации API веб-сокетов.

Поэтому, когда я реализую ServerApplicationConfig, я больше не получаю это исключение, и кажется, что сервер запускается без проблем, но он возвращает 404, что я считаю допустимыми попытками подключения (правильный хост, порт и контекстный путь).

Что мне не хватает?

Дополнительная информация: я расширил TyrusServerEndpointConfigurator и предоставил переопределение для метода ModifyHandshake(). Сервер возвращает 404 без вызова этого метода.


person Charlie Davis    schedule 11.09.2014    source источник
comment
Я вижу, что вы уже ответили на свой вопрос, но вы ошибаетесь, говоря, что Tyrus нарушает спецификацию. ServerApplicationConfig ДОЛЖЕН быть реализован при развертывании программной конечной точки. Аннотированные конечные точки прекрасно работают и без него. (и, чтобы быть абсолютно точным в отношении спецификации: автономный сервер не является частью спецификации, поэтому в этом случае Tyrus может делать все, что захочет).   -  person Pavel Bucek    schedule 12.09.2014
comment
Документация, на которую я ссылаюсь, — это документация конструктора Tyrus 1.8.2 Server:   -  person Charlie Davis    schedule 16.09.2014


Ответы (1)


Проблема оказалась в путанице в том, как Tyrus строит контекстный путь. Существует путь, передаваемый конструктору сервера, и путь, возвращаемый методом ServerEndpointConfig getPath(). Они объединяются для формирования полного контекстного пути.

Таким образом, если вы укажете "/server" в конструкторе сервера и "/endpoint" в ServerEndpointConfig.getPath(), сервер будет принимать запросы на подключение в "/server/endpoint".

person Charlie Davis    schedule 11.09.2014
comment
Что совершенно нормально. Путь контекста — это место, где развернуто ваше приложение, путь к конечной точке, идентифицируемый как конечная точка в этом приложении. Это точно так же, как когда вы имеете дело с развертыванием сервлета. - person Pavel Bucek; 12.09.2014