java - 使用 Spring websockets 的自定义 Stomp header

标签 java spring header stomp spring-websocket

我有一个基本的 spring websocket 应用程序,它当前向订阅者发送基本数据。 目前,系统使用 SimpMessageSendingOperations 类作为消息处理程序。 如果我调用 SimpMessageSendingOperations.convertAndSend(destination, object),则对象将被转换并由订阅的客户端接收。

我希望能够向客户发送自定义 header 。 我尝试使用 SimpMessageSendingOperations.convertAndSend(destination, object, headers) 方法来执行此操作。但是,自定义 header 不包含在 stomp 消息中。

通过代码调试看起来像 StompHeaderAccessor.toStompHeaderMap() 方法调用 toNativeHeaderMap(),它使用 native header 和原始 native header 映射来构建 stomp header 。

有没有办法将自定义 header 添加到 stomp 消息中?

最佳答案

StompHeaderAccessor 扩展了 NativeMessageHeaderAccessor,它似乎是非 stomp header 所在的位置,除了它们都存储在一个名为 nativeHeaders 的 header 中——它本身就是一个映射。

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

将自定义 header 包装到 nativeHeaders header 的简单服务器端拦截器应该足以将它们暴露在客户端,在那里它们可以作为映射 message.headers.nativeHeaders 使用。同样,您可以编写客户端拦截器以将 nativeHeaders 移动到常规 header 中 - 因此在您的客户端知道该消息之前,所有预期的 header 都只是在 message.headers 中。

关于java - 使用 Spring websockets 的自定义 Stomp header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21480352/

相关文章:

java - 在 Spring 中为 RestTemplate 客户端抛出 ResourceAccessException vs HttpClientErrorException

php - WebDesign : Header file, 但带有自定义页面标题?

javascript - 使汉堡 ID 在两个 header 中工作

java - 我是否在类图中完全指定了语言类?

java - 如何在运行时管理两组属性?

java - 如何分割用户输入的字符串

java - 在没有 IDE 的情况下构建 jar 时出现 "Unable to resolve persistence unit"错误

java - Spring框架中回调方法和Bean后处理器的区别

css - Slider Revolution- 刷新时改变标题列

java - 百分比计算部分在java中不起作用