使用Spring Websockets自定义Stomp头信息

7
我有一个基本的Spring WebSocket应用程序,目前向订阅者发送基本数据。 当前系统使用SimpMessageSendingOperations类作为消息处理程序。 如果我调用SimpMessageSendingOperations.convertAndSend(destination, object),那么对象将被转换并由已订阅的客户端接收。
我想能够向客户端发送自定义标头。 我尝试使用SimpMessageSendingOperations.convertAndSend(destination, object, headers)方法来做到这一点。然而,自定义标头未包含在STOMP消息中。
通过代码调试,看起来StompHeaderAccessor.toStompHeaderMap()方法调用toNativeHeaderMap(),它使用本机标头和原始本机标头映射来构建STOMP标头。
是否有方法将自定义标头添加到STOMP消息中?
1个回答

7
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中。

使用这种方法,我能够通过向convertAndSend方法添加MessagePostProcessor参数来添加自定义标头。然后,在重写的postProcessMessage中添加本机标头的逻辑,如建议的那样。 - Jaimie Whiteside
1
嗨,Jaimie,你能否在 JIRA 中创建一个请求来解决这个问题呢?虽然你已经找到了解决方法,但实际上应该不难弄清楚的。 - Rossen Stoyanchev
谢谢您的回答! 您能否解释一下如何获取发送到服务器的消息头? - udenfox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接