我们的 javascript websocket 客户端将“自定义” header 添加到所有 STOMP
消息中。
我的项目使用 spring-websocket @Controller
处理 websocket 端点。
@MessageMapping(value = "/mymessages")
public void save(@Payload ToBeSaved payload, @Headers MessageHeaders headers) {
service.save(toMsg(payload, headers));
}
protected <P> Message<P> toMsg(P payload, MessageHeaders headers) {
return MessageBuilder.createMessage(payload, headers);
}
Controller 修改有效载荷,然后将新的有效载荷和原始 websocket header (包括自定义 header )传递给 spring-integration @MessagingGateway
。
底层 IntegrationFlow
尝试通过使用 SPLExpression headers['custom']
访问消息 header 来访问“自定义” header 。
不幸的是,headers['custom']
始终为 null,因为 custom
实际上包含在 nativeHeaders
中。
我还没有找到告诉 IntegrationFlow
查看 nativeHeaders
的方法。
spring-websocket 中有没有一种方法可以将所有 native header 复制为普通 header ?
提前致谢
最佳答案
spring-websocket 在这件事上对你无能为力。这不是它的责任。
如果您真的想访问 nativeHeaders
中的某些内容,您应该手动执行此操作。
对于您的特定情况,SpEL 可能如下所示:
headers['nativeHeaders']['custom']
因为 nativeHeaders
是 Map
从另一边你可以使用<header-enricher>
在你的下游流中弹出所有这些 nativeHeaders
到顶层。
还有一点:自 Spring Integration 4.2
我们为 STOMP 适配器提供原生支持。还有一个 StompHeaderMapper
这正是你想要的,那里的代码看起来像:
else if (StompHeaderAccessor.NATIVE_HEADERS.equals(name)) {
MultiValueMap<String, String> multiValueMap =
headers.get(StompHeaderAccessor.NATIVE_HEADERS, MultiValueMap.class);
for (Map.Entry<String, List<String>> entry1 : multiValueMap.entrySet()) {
name = entry1.getKey();
if (shouldMapHeader(name, this.outboundHeaderNames)) {
String value = entry1.getValue().get(0);
if (StringUtils.hasText(value)) {
setStompHeader(target, name, value);
}
}
}
}
关于spring-integration - 自动将 stomp native header 添加到 header 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31688222/