2016-02-29 15 views
5

tôi chỉ gặp một chút vấn đề đặc biệt:Lambda không làm việc trong WebSocket phiên

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

Có ai biết tại sao biểu thức lambda sẽ không làm việc trong trường hợp này? Không có lỗi biên dịch, không có ngoại lệ, không có gì. Phương thức '' onMessage '' không được gọi.

Tôi sử dụng Java 1.8.0_65 và triển khai tham chiếu Tyrus 1.9.

Trả lời

2

xin vui lòng xem https://blogs.oracle.com/PavelBucek/entry/websocket_api_1_1_released

TLDR; bạn phải sử dụng 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); 

để sử dụng lambdas làm người gửi tin nhắn.

-2

Từ sự hiểu biết của tôi MessageHandler sẽ cần phải là một @FunctionalInterface để cho phép biểu thức lambda ở đây, không phải như vậy.

+1

["Tuy nhiên, trình biên dịch sẽ xử lý mọi giao diện đáp ứng định nghĩa của giao diện chức năng dưới dạng giao diện chức năng bất kể có chú thích FunctionalInterface có trên khai báo giao diện hay không."] (Https://docs.oracle. com/javase/8/docs/api/java/lang/FunctionalInterface.html) Bạn không cần chú thích để sử dụng nó như lambda –

+1

Ngoài ra, sẽ có lỗi biên dịch nếu trường hợp đó xảy ra. –

Các vấn đề liên quan