将 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);
}
}
}
}
我们的 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);
}
}
}
}