java - Lambda 在 Websocket session 中不起作用

标签 java websocket tyrus

我刚遇到一个奇特的小问题:

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);
}

有人知道为什么 lambda 表达式在这种情况下不起作用吗?没有编译错误,没有异常,什么都没有。只是没有调用方法“onMessage”。

我使用 Java 1.8.0_65 和 Tyrus 引用实现 1.9。

最佳答案

请参阅https://blogs.oracle.com/PavelBucek/entry/websocket_api_1_1_released

tldr;你必须使用 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. I.e. 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);

为了使用 lambda 作为消息处理器。

关于java - Lambda 在 Websocket session 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35695605/

相关文章:

java - 小服务程序间通信

javascript - 断开连接后,Socket.io 未正确触发事件

java - 无法将传入缓冲区大小设置为 Tyrus 客户端

java - 获取响应代码不是 101 : 400 in Java Websocket API client

java - 是否可以在64位java/linux环境中运行8GB堆大小的Weblogic

javascript - 通过 JSON 向 SQL 数据库发送和接收数组

c# - Windows Universal App 保持打开 WebSocket

java - GlassFish 4 或 Tyrus 中的错误 : Decoder#willDecode is called twice for each ByteBuffer?

java - 在方法中使用 ActionListeners 创建 GUI

java - Android:onClick() 中的动画 View