Lambda not working in Websocket session

I ran into a rather complicated problem:

javax.websocket.Session session = //... // this works newSession.addMessageHandler(new MessageHandler.Whole<String>() { @Override public void onMessage(String message) { MyWebSocket.this.onMessage(message); } }); // these don't work newSession.addMessageHandler((MessageHandler.Whole<String>) MyWebSocket.this::onMessage); newSession.addMessageHandler((MessageHandler.Whole<String>) message -> MyWebSocket.this.onMessage(message)); void onMessage(String message) { System.out.println(message); } 

Does anyone know why lambda expressions will not work in this case? Compilation error, no exception, nothing. The `` onMessage '' method is simply not called.

I am using Java 1.8.0_65 and the reference implementation of Tyrus 1.9.

+5
source share
2 answers

see https://blogs.oracle.com/PavelBucek/entry/websocket_api_1_1_released

TL; DR; you should use Session#addMessageHandler(Class<T> clazz, MessageHandler.Whole<T> handler)

 /** * Register to handle to incoming messages in this conversation. A maximum of one message handler per * native websocket message type (text, binary, pong) may be added to each Session. Ie a maximum * of one message handler to handle incoming text messages a maximum of one message handler for * handling incoming binary messages, and a maximum of one for handling incoming pong * messages. For further details of which message handlers handle which of the native websocket * message types please see {@link MessageHandler.Whole} and {@link MessageHandler.Partial}. * Adding more than one of any one type will result in a runtime exception. * * @param clazz type of the message processed by message handler to be registered. * @param handler whole message handler to be added. * @throws IllegalStateException if there is already a MessageHandler registered for the same native * websocket message type as this handler. */ public void addMessageHandler(Class<T> clazz, MessageHandler.Whole<T> handler); 

to use lambdas as message handlers.

+2
source

From my understanding, MessageHandler should be @FunctionalInterface to @FunctionalInterface lambda expressions here, which is not the case.

-2
source

Source: https://habr.com/ru/post/1244094/


All Articles