Spring WS运行时动态修改SOAP服务地址的实现方法咨询
问题原因
setLocationUri未生效是Spring WS的默认行为导致的:2.1及以上版本默认开启WSDL地址自动转换,会根据当前请求的协议、域名、端口、上下文路径自动重写SOAP Address节点的URL,硬编码或者静态设置的locationUri会被覆盖。
解决方案
方案1:关闭自动转换,直接读取配置动态设置地址
适合多环境需要固定配置完整SOAP访问地址的场景
- 在配置文件(application.properties/application.yml)中添加自定义配置项
# dev环境示例,prod环境替换为对应正式地址 soap.service.address=https://dev.example.com/ws/countries
- 注册
WsdlDefinitionHandlerAdapter关闭地址自动转换逻辑
@Bean public WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter() { WsdlDefinitionHandlerAdapter adapter = new WsdlDefinitionHandlerAdapter(); adapter.setTransformLocations(false); return adapter; }
- 注入配置值,动态设置locationUri
@Value("${soap.service.address}") private String soapServiceAddress; @Bean(name = "countries") public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) { DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition(); wsdl11Definition.setPortTypeName("CountriesPort"); wsdl11Definition.setLocationUri(soapServiceAddress); wsdl11Definition.setSchema(countriesSchema); return wsdl11Definition; }
方案2:自定义地址转换规则
适合需要保留动态适配访问域名能力、仅自定义路径部分的场景(比如部署在反向代理后,域名由客户端访问地址决定)
- 实现自定义
LocationTransformer,从配置读取路径参数,自定义拼接规则
public class CustomSoapLocationTransformer implements LocationTransformer { @Value("${soap.service.path:/countries}") private String soapServicePath; @Override public String transformLocation(String originalLocation, HttpServletRequest request) { // 保留请求侧的协议、域名、端口、上下文路径,仅替换服务路径 String baseUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); return baseUrl + soapServicePath; } }
- 注册自定义转换规则到HandlerAdapter
@Bean public WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter() { WsdlDefinitionHandlerAdapter adapter = new WsdlDefinitionHandlerAdapter(); adapter.setLocationTransformer(new CustomSoapLocationTransformer()); return adapter; }
内容的提问来源于stack exchange,提问作者Suresh
相关产品推荐
相关产品推荐

