Spring Integration 6.x HTTP出站网关URI变量无法解析应用配置问题
Spring Integration 6.x HTTP出站网关URI变量解析问题解决方案
问题描述
从Spring Integration v5.x升级到v6.x后,XML配置的HTTP出站网关使用${sample.api.url}作为URI变量表达式时,出现“URI不是绝对路径”错误。此前v5.x中该逻辑正常运行,且已验证表达式能正确解析应用配置属性。
原因分析
Spring Integration 6.x强化了HTTP出站网关的URL校验逻辑,在bean初始化阶段就会检查URL是否为绝对路径;而v5.x通常是在实际发送请求时才替换URI变量并完成校验。初始化阶段{url}占位符未被替换,导致网关判定URL非绝对路径。
解决方案
方案1:直接在url属性中使用配置占位符(推荐)
去掉URI变量配置,直接将配置占位符写入url属性,初始化阶段即可解析为完整绝对URL:
<int-http:outbound-gateway id="sampleGateway" request-channel="jsonInputChannel" url="${sample.api.url}/call-some-api" http-method="POST" expected-response-type="java.lang.String" charset="UTF-8" reply-timeout="30000" reply-channel="nullChannel"> </int-http:outbound-gateway>
方案2:使用@Value显式注入配置值
若需保留URI变量格式,可通过SpEL的@Value语法直接获取配置值,确保初始化时变量被正确替换:
<int-http:outbound-gateway id="sampleGateway" request-channel="jsonInputChannel" url="{url}/call-some-api" http-method="POST" expected-response-type="java.lang.String" charset="UTF-8" reply-timeout="30000" reply-channel="nullChannel"> <int-http:uri-variable name="url" expression="@Value('${sample.api.url}')"/> </int-http:outbound-gateway>
方案3:通过配置类中转属性
显式定义配置类注入属性,再在URI变量表达式中引用该bean的属性,适用于更复杂的配置场景:
- 创建配置类:
@Component("apiConfig") public class ApiConfig { @Value("${sample.api.url}") private String apiUrl; public String getApiUrl() { return apiUrl; } }
- 修改XML配置:
<int-http:outbound-gateway id="sampleGateway" request-channel="jsonInputChannel" url="{url}/call-some-api" http-method="POST" expected-response-type="java.lang.String" charset="UTF-8" reply-timeout="30000" reply-channel="nullChannel"> <int-http:uri-variable name="url" expression="@apiConfig.apiUrl"/> </int-http:outbound-gateway>
内容的提问来源于stack exchange,提问作者Chandrashekhar Tupe
相关产品推荐
相关产品推荐

