Spring Integration映射请求头至响应头时无法忽略大小写的问题求助
解决Spring Integration中HTTP头大小写敏感的映射问题
针对你遇到的请求头与响应头因大小写差异无法自动替换的问题,提供以下两种可行解决方案:
方案一:自定义大小写不敏感的HttpHeaderMapper
继承DefaultHttpHeaderMapper,重写核心方法统一头名称的大小写规则,让框架将不同大小写的同名头视为同一个:
import org.springframework.http.HttpHeaders; import org.springframework.integration.http.support.DefaultHttpHeaderMapper; import java.util.HashMap; import java.util.Map; public class CaseInsensitiveHttpHeaderMapper extends DefaultHttpHeaderMapper { @Override protected String normalizeHeaderName(String headerName) { // 将所有头名称转为小写,消除大小写差异 return headerName.toLowerCase(); } @Override protected void populateStandardHeaders(Map<String, Object> headers, HttpHeaders httpHeaders) { // 预处理响应头,将所有键转为小写后再交给父类处理 Map<String, String> lowerCaseHeaders = new HashMap<>(); httpHeaders.forEach((key, value) -> lowerCaseHeaders.put(key.toLowerCase(), value.get(0))); super.populateStandardHeaders(headers, HttpHeaders.wrap(lowerCaseHeaders)); } }
配置使用自定义Mapper
在Spring配置类中注册该Mapper,并绑定到出站网关:
@Bean public HttpHeaderMapper caseInsensitiveHeaderMapper() { CaseInsensitiveHttpHeaderMapper mapper = new CaseInsensitiveHttpHeaderMapper(); // 配置需要映射的请求/响应头,包含目标头X-JWS-Signature mapper.setOutboundHeaderNames(new String[]{"X-JWS-Signature", "Content-Type"}); mapper.setInboundHeaderNames(new String[]{"X-JWS-Signature", "Content-Length"}); return mapper; } @Bean public HttpRequestExecutingMessageHandler outboundGateway() { HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("你的接口地址"); handler.setHeaderMapper(caseInsensitiveHeaderMapper()); // 其他网关配置... return handler; }
方案二:手动处理响应头(场景化解决方案)
如果仅需要处理X-JWS-Signature这一个特定头,可直接在出站网关后添加转换器,手动完成头的替换:
import org.springframework.integration.transformer.GenericTransformer; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import java.util.HashMap; import java.util.Map; @Bean public GenericTransformer<Message<?>, Message<?>> jwsHeaderTransformer() { return message -> { Object responseJwsValue = message.getHeaders().get("X-Jws-Signature"); if (responseJwsValue != null) { Map<String, Object> updatedHeaders = new HashMap<>(message.getHeaders()); updatedHeaders.put("X-JWS-Signature", responseJwsValue); updatedHeaders.remove("X-Jws-Signature"); return MessageBuilder.createMessage(message.getPayload(), updatedHeaders); } return message; }; }
将该转换器绑定到出站网关的输出通道即可生效。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

