Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring WebSocket的自定义踩踏收割台_Java_Spring_Header_Stomp_Spring Websocket - Fatal编程技术网

Java 使用Spring WebSocket的自定义踩踏收割台

Java 使用Spring WebSocket的自定义踩踏收割台,java,spring,header,stomp,spring-websocket,Java,Spring,Header,Stomp,Spring Websocket,我有一个基本的SpringWebSocket应用程序,它当前向订阅者发送基本数据。 当前,系统使用SimpMessageSendingOperations类作为消息处理程序。 如果我调用SimpMessageSendingOperations.convertAndSend(目标,对象),则该对象将被转换并由订阅的客户端接收 我想能够发送一个自定义头的客户端。 我已经尝试使用SimpMessageSendingOperations.convertAndSend(目的地、对象、标题)方法来实现这一点

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

我想能够发送一个自定义头的客户端。 我已经尝试使用
SimpMessageSendingOperations.convertAndSend(目的地、对象、标题)
方法来实现这一点。但是,stomp消息中不包括自定义标头

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


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

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

@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);
}
@MessageMapping(“/hello”)
@发送至(“/主题/问候语”)
公共GenericMessage问候语(HelloMessage message)引发异常{
Map nativeHeaders=new HashMap();
nativeHeaders.put(“你好”,Collections.singletonList(“世界”);
Map headers=newhashmap();
headers.put(NativeMessageHeaderAccessor.NATIVE_headers,nativeHeaders);
返回新的GenericMessage(新的问候语(“Hello,+message.getName()+”!”),标题);
}

一个简单的拦截器服务器端将您的自定义头包装到nativeHeaders头应该足以在客户端公开它们,它们将作为映射消息.headers.nativeHeaders提供。同样,您可以编写一个客户端拦截器,将NativeHeader移动到常规头中-因此在您的客户端意识到消息之前,所有预期的头都在message.headers中。

使用此方法,我可以通过向
convertAndSend
方法添加
MessagePostProcessor
参数来添加自定义头。被重写的
postprocessage
中的逻辑随后添加本机头,如suggestedhi Jaimie所示。您能在JIRA中创建一个请求来解决这个问题吗?虽然你已经找到了一种方法,但其实也不难理解。谢谢你的回答!您还可以解释一下如何获取发送给服务器的消息的标题吗?