You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WS运行时动态修改SOAP服务地址的实现方法咨询

问题原因

setLocationUri未生效是Spring WS的默认行为导致的:2.1及以上版本默认开启WSDL地址自动转换,会根据当前请求的协议、域名、端口、上下文路径自动重写SOAP Address节点的URL,硬编码或者静态设置的locationUri会被覆盖。

解决方案

方案1:关闭自动转换,直接读取配置动态设置地址

适合多环境需要固定配置完整SOAP访问地址的场景

  1. 在配置文件(application.properties/application.yml)中添加自定义配置项
# dev环境示例,prod环境替换为对应正式地址
soap.service.address=https://dev.example.com/ws/countries
  1. 注册WsdlDefinitionHandlerAdapter关闭地址自动转换逻辑
@Bean
public WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter() {
    WsdlDefinitionHandlerAdapter adapter = new WsdlDefinitionHandlerAdapter();
    adapter.setTransformLocations(false);
    return adapter;
}
  1. 注入配置值,动态设置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:自定义地址转换规则

适合需要保留动态适配访问域名能力、仅自定义路径部分的场景(比如部署在反向代理后,域名由客户端访问地址决定)

  1. 实现自定义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;
    }
}
  1. 注册自定义转换规则到HandlerAdapter
@Bean
public WsdlDefinitionHandlerAdapter wsdlDefinitionHandlerAdapter() {
    WsdlDefinitionHandlerAdapter adapter = new WsdlDefinitionHandlerAdapter();
    adapter.setLocationTransformer(new CustomSoapLocationTransformer());
    return adapter;
}

内容的提问来源于stack exchange,提问作者Suresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:36:04