Spring Integration如何基于外部服务响应添加消息头并保留原负载?
解决方案:保留原Payload并根据外部服务响应状态码添加头信息
要实现基于外部服务响应状态码给原消息加头、同时保留原JSON负载的需求,核心是避免调用外部服务后丢失原Payload,具体可通过临时缓存原Payload到消息头再恢复的方式实现,步骤如下:
- 调用外部服务前,将原Payload存入临时消息头,防止被外部服务响应覆盖
- 调用外部服务,此时消息Payload会变为外部服务的响应,但原Payload已存在于头中
- 恢复原Payload作为当前消息的负载,同时根据外部服务返回的状态码头(
HttpHeaders.STATUS_CODE)添加指定自定义头 - 最后将处理后的消息发送到目标
outboundGateway
对应的代码实现:
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.http.dsl.Http; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; // 构建集成流程 IntegrationFlows.from(inboundGateway) // 缓存原Payload到临时消息头 .enrichHeaders(headersSpec -> headersSpec .header("original_payload", Message::getPayload)) // 调用外部服务,Spring Integration自动将响应状态码存入HttpHeaders.STATUS_CODE头 .handle(Http.outboundGateway(url) .restTemplate(restTemplate)) // 恢复原Payload并添加自定义头 .transform(message -> { Object originalPayload = message.getHeaders().get("original_payload"); HttpStatus statusCode = (HttpStatus) message.getHeaders().get(HttpHeaders.STATUS_CODE); // 根据状态码设置指定头,示例:200对应"success",404对应"not_found" String customHeaderValue = statusCode == HttpStatus.OK ? "success" : "not_found"; return MessageBuilder.withPayload(originalPayload) .copyHeaders(message.getHeaders()) .removeHeader("original_payload") // 清理临时头 .setHeader("custom_status_header", customHeaderValue) .build(); }) // 发送到目标outboundGateway .handle(outboundGateway) .get();
补充说明:
- Spring Integration的HTTP Outbound Gateway会自动将外部服务的响应状态码以
HttpHeaders.STATUS_CODE为键存入消息头,无需手动解析响应内容 - 如果不需要保留外部服务响应的其他头信息,可以替换
copyHeaders为仅复制原消息头,避免冗余数据
内容的提问来源于stack exchange,提问作者mariusz
相关产品推荐
相关产品推荐

