Java Websocket addMessageHandler lamdba ломает пользовательские де-кодеры - PullRequest
0 голосов
/ 23 сентября 2019

Я играю с Java WebSockets и столкнулся с проблемой, которую не могу объяснить самому себе.Поскольку у моего Endpoint есть собственный конструктор, я использую ServerEndpointConfig.Configurator для генерации конечной точки.

List<Class<? extends Encoder>> encoders = new ArrayList<>();
encoders.add(MessageEncoder.class);
List<Class<? extends Decoder>> decoders = new ArrayList<>();
decoders.add(MessageDecoder.class);


ServerEndpointConfig endpointConfig = ServerEndpointConfig.Builder
  .create(AppEndpoint.class, "/ws-test")
  .encoders(encoders)
  .decoders(decoders)
  .configurator(new AppEndpointConfig(config, factory))
  .build();

Так как моя конечная точка не помечена @OnOpen, @OnClose, @OnError, но расширяет java.websocket.Endpoint и @OnMessage нет, поскольку MessageHandler должен быть добавлен в метод onOpen.

public void onOpen(Session session, EndpointConfig config) {
  logger.info("Created new session on communication server with id {}.", session.getId());
  session.setMaxIdleTimeout(this.config.getServer().getTimeout());

  session.addMessageHandler(new MessageHandler.Whole<JsonNode>() {
    @Override
    public void onMessage(JsonNode message) {
      logger.debug("Received command from session {}: {}", session.getId(), message.toString());
    }
  });
}

Это все работает, но моя IDE предлагает заменитьMessageHandler с лямбда-выражением.Я заменил метод на session.addMessageHandler((MessageHandler.Whole<JsonNode>) message -> { [..] });, который должен быть действительным, но когда я запускаю сервер с лямбда-выражением, я получаю сообщение о том, что пользовательские эн- и декодеры для JsonNode не могут быть найдены и сервер падает.

Должна ли лямбда быть другой?Или это недостаток реализации WebSocket?Было бы замечательно, если бы кто-то мог просветить меня об этом.

...