Java Lambda在Websocket会话中不工作

Java Lambda在Websocket会话中不工作,java,websocket,tyrus,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);

我只是遇到了一个奇怪的小问题:

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);
}
javax.websocket.Session会话=/。。。
//这很有效
newSession.addMessageHandler(newMessageHandler.Whole(){
@凌驾
公共消息无效(字符串消息){
MyWebSocket.this.onMessage(消息);
}
});
//这些不起作用
addMessageHandler((MessageHandler.Whole)MyWebSocket.this::onMessage);
newSession.addMessageHandler((MessageHandler.Whole)message->MyWebSocket.this.onMessage(message));
无效消息(字符串消息){
System.out.println(消息);
}
有人知道为什么lambda表达式在这种情况下不起作用吗?没有编译错误,没有异常,什么都没有。只是没有调用方法“onMessage”


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

根据我的理解,
MessageHandler
需要是一个
@functional接口
才能允许lambda表达式,但事实并非如此。

请参见

tldr;你必须使用

/**
*注册以处理此对话中的传入消息。每个服务器最多有一个消息处理程序
*可以将本机websocket消息类型(文本、二进制、pong)添加到每个会话中。即最高
*处理传入文本消息的一个消息处理程序的最大值为
*处理传入的二进制消息,最多一条用于处理传入的pong
*信息。有关哪个消息处理程序处理哪个本机websocket的更多详细信息
*消息类型请参见{@link MessageHandler.Whole}和{@link MessageHandler.Partial}。
*添加任何一种类型中的多个将导致运行时异常。
*
*@param clazz由要注册的消息处理程序处理的消息的类型。
*@param handler要添加的整个消息处理程序。
*@如果已经为同一本机注册了MessageHandler,则会引发IllegalStateException
*websocket消息类型与此处理程序相同。
*/
public void addMessageHandler(类clazz,MessageHandler.Whole handler);

为了将lambda用作消息处理程序。

不需要注释将其用作lambda,如果是这种情况,则会出现编译错误。
/**
* 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);