spring-integration - 自动将 stomp native header 添加到 header 的最佳方法

标签 spring-integration spring-websocket

我们的 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']

因为 nativeHeadersMap

从另一边你可以使用<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/

相关文章:

java - 使用 Spring Rest 模板使用 Oauth2(授权码)rest api

spring websocket 与 spring security 启动失败, "No bean named ' stompWebSocketHandlerMapping'已定义'

spring-boot - Spring WebFlux 认证的 WebSocket 连接

spring - 如何在 Spring 中从 RabbitMQ 正确获取所有队列消息?

http - WebSocket 服务器如何处理多个传入的连接请求?

websocket - 如何使用 Spring Stomp 拦截连接和订阅

java - SSL 握手异常 :no cipher suites in common in spring integration TCP Server

java - Spring 与 Citrus 集成 : no output-channel or replyChannel header available

java - 使用 spring 集成注释将多个 channel 发送到单个 channel

java - spring-integration 启动时动态创建 MessageSource