【问题标题】:Lambda Does Not Work In Websocket SessionLambda 在 Websocket 会话中不起作用
【发布时间】:2016-06-12 06:13:13
【问题描述】:

刚刚遇到一个奇葩的小问题:

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。

【问题讨论】:

    标签: java websocket tyrus


    【解决方案1】:

    请看https://blogs.oracle.com/PavelBucek/entry/websocket_api_1_1_released

    tldr;你必须使用Session#addMessageHandler(Class&lt;T&gt; clazz, MessageHandler.Whole&lt;T&gt; 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);
    

    为了使用 lambdas 作为消息处理程序。

    【讨论】:

      【解决方案2】:

      据我了解,MessageHandler 需要是 @FunctionalInterface 才能在此处允许 lambda 表达式,但事实并非如此。

      猜你喜欢
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      相关资源
      最近更新 更多