将 stomp native headers 自动添加到 headers 的最佳方式

Best way to automatically add stomp native headers to headers

我们的 javascript websocket 客户端将 "custom" headers 添加到所有 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);
}

控制器修改负载,然后将新负载和原始 websocket headers(包括自定义的)传递给 spring-integration @MessagingGateway

底层 IntegrationFlow 尝试通过使用 SPLExpression headers['custom'].
访问消息 headers 来访问 "custom" headers 不幸的是 headers['custom'] 始终为空,因为 custom 实际上包含在 nativeHeaders.

我还没有找到告诉 IntegrationFlow 调查 nativeHeaders 的方法。

在 spring-websocket 中有没有一种方法可以正常复制所有本机 headers headers?

提前致谢

spring-websocket 在这件事上对你无能为力。这不是它的责任。

如果您真的想访问 nativeHeaders 中的某些内容,您应该手动进行。

对于您的特定情况,SpEL 可能如下所示:

headers['nativeHeaders']['custom']

因为nativeHeaders也是Map

从另一端,您可以在下游流程中使用 <header-enricher> 将所有 nativeHeaders 弹出到顶层。

还有一点:由于 Spring 集成 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);
                    }
                }
            }
        }