Я играю с 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?Было бы замечательно, если бы кто-то мог просветить меня об этом.