2014-01-31 23 views
6

我有一個基本的spring websocket應用程序,它目前向訂閱者發送基本數據。 目前系統使用SimpMessageSendingOperations類作爲消息處理程序。 如果我打電話SimpMessageSendingOperations.convertAndSend(destination, object),那麼該對象將被訂閱的客戶端轉換並接收。使用Spring websockets定製stomp頭文件

我希望能夠發送一個自定義標題給客戶端。 我已經嘗試使用SimpMessageSendingOperations.convertAndSend(destination, object, headers)方法來做到這一點。但是,自定義標題不包含在stomp消息中。

通過代碼調試它看起來像StompHeaderAccessor.toStompHeaderMap()方法調用 toNativeHeaderMap()它使用本機標頭和原始本地標頭映射來構建stomp標頭。

有沒有辦法讓自定義頭添加到踩踏消息?

回答

5

StompHeaderAccessor擴展了NativeMessageHeaderAccessor,它似乎是非stomp頭文件所在的地方,除了它們都存儲在一個名爲nativeHeaders的頭文件中 - 它本身就是一張地圖。

@MessageMapping("/hello") 
@SendTo("/topic/greetings") 
public GenericMessage<Greeting> greeting(HelloMessage message) throws Exception {  
    Map<String, List<String>> nativeHeaders = new HashMap<>(); 
    nativeHeaders.put("hello", Collections.singletonList("world")); 

    Map<String,Object> headers = new HashMap<>(); 
    headers.put(NativeMessageHeaderAccessor.NATIVE_HEADERS, nativeHeaders); 

    return new GenericMessage<Greeting>(new Greeting("Hello, " + message.getName() + "!"), headers); 
} 

一個簡單的攔截服務器端來包裝你的自定義頁眉到nativeHeaders頭應該足以揭露他們的客戶端,他們將可作爲地圖message.headers.nativeHeaders。同樣,你可以編寫一個客戶端攔截器來將nativeHeaders移動到常規頭文件中,因此在客戶端知道該消息之前,所有預期的頭文件都只存在於message.headers中。

+0

使用此功能,我可以通過向'convertAndSend'方法添加一個'MessagePostProcessor'參數來添加自定義標題。被覆蓋的'postProcessMessage'中的邏輯然後按建議添加本地頭文件 –

+1

嗨Jaimie,你能否在JIRA中創建一個請求來解決這個問題?雖然你已經找到了一個方法來做到這一點,但它確實不應該很難弄清楚。 –

+0

@Rossen [JIRA SPR-11387](https://jira.springsource.org/browse/SPR-11387)創建 –

相關問題