Spring integration 自动将stomp本机头添加到头的最佳方法

Spring integration 自动将stomp本机头添加到头的最佳方法,spring-integration,spring-websocket,Spring Integration,Spring Websocket,我们的javascript websocket客户端向所有STOMP消息添加“自定义”标题。 我的项目使用SpringWebSocket@Controller处理websocket端点 @MessageMapping(value = "/mymessages") public void save(@Payload ToBeSaved payload, @Headers MessageHeaders headers) { service.save(toMsg(payload, header

我们的javascript websocket客户端向所有
STOMP
消息添加“自定义”标题。
我的项目使用SpringWebSocket
@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);
}
@MessageMapping(value=“/mymessages”)
public void save(@Payload tobesave Payload,@Headers MessageHeaders){
save(toMsg(有效负载,报头));
}  
受保护的

消息

toMsg(P有效负载,消息头){ 返回MessageBuilder.createMessage(有效负载、头); }

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

@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);
}
底层的
IntegrationFlow
尝试通过使用SPLExpression
headers['custom']
访问消息头来访问“自定义”头
不幸的是,
headers['custom']
始终为空,因为
custom
实际上包含在
nativeHeaders

我还没有找到方法告诉
IntegrationFlow
查看
nativeHeaders

@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);
}
SpringWebSocket中有没有办法将所有本机头复制为普通头


提前感谢

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

如果您确实想访问
nativeHeaders
中的某些内容,则应手动执行此操作

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

headers['nativeHeaders']['custom']
因为
nativeHeaders
也是一个
Map

从另一端,您可以在下游流程中使用
,将所有这些
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);
                    }
                }
            }
        }
else if(StompHeaderAccessor.NATIVE_HEADERS.equals(name)){
多值映射多值映射=
headers.get(StompHeaderAccessor.NATIVE_headers,MultiValueMap.class);
对于(Map.Entry entry1:multiValueMap.entrySet()){
name=entry1.getKey();
if(shouldMapHeader(名称,this.outboundHeaderNames)){
字符串值=entry1.getValue().get(0);
if(StringUtils.hasText(值)){
SetTompHeader(目标、名称、值);
}
}
}
}

谢谢,我还没有尝试过
标题['nativeHeaders']['custom']
,但将来会尝试。