覆盖 WSDL 中的整个地址

问题描述 投票:0回答:2

我使用本指南创建了一个简单的 spring-boot SOAP Web 服务: https://spring.io/guides/gs/having-web-service/

我将其部署到云服务,但前面会有一个 API 管理层。

我希望 WSDL 使用 API 管理层的 URL。 (本质上是对地址进行硬编码。)

我尝试过两种方法:

  1. 使用 DefaultWsdl11Definition.setLocationUri()

    @Bean(name = "countries")
    public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
    DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
    wsdl11Definition.setPortTypeName("CountriesPort");
    wsdl11Definition.setLocationUri("http://example.com/ws");
    wsdl11Definition.setTargetNamespace("http://spring.io/guides/gs-producing-web-service");
    wsdl11Definition.setSchema(countriesSchema);
    return wsdl11Definition;
    }
    
  2. 使用 SimpleWsdl11Definition.setWsdl() 指向手动编辑的 WSDL

    @Bean(name = "countries")
    public SimpleWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) {
    SimpleWsdl11Definition wsdl11Definition = new SimpleWsdl11Definition();
    wsdl11Definition.setWsdl(new ClassPathResource("countries.wsdl")); //this WSDL was edited to have the path I want
    return wsdl11Definition;
    } 
    

我正在使用 Maven 进行构建。在这两种情况下,应用程序托管的 WSDL 都会将主机名替换为其运行的服务器,例如http://localhost:8080/,然后使用 URI 的其余部分。

    <wsdl:service name="CountriesPortService">
    <wsdl:port binding="tns:CountriesPortSoap11" name="CountriesPortSoap11">
    <soap:address location="http://localhost:8080/ws"/>
    </wsdl:port>
    </wsdl:service>

如何设置/覆盖

的主机名部分
spring-boot soap wsdl
2个回答
4
投票

我认为您正在 Web 服务配置类的 messageDispatcherServlet 方法中使用 setTransformWsdlLocations(true) 。此设置将根据其运行的环境转换 URL。 删除此行,以便它将采用默认设置 fals 并且不会覆盖。


0
投票

一个老问题,但我最近一直在努力解决类似的问题。我的 Spring Boot Web 服务在本地 https 端口上运行良好,并生成正确的 .wsdl 端点地址,但是当移动到测试/生产环境时,不知何故,

应该是

我设法通过创建一个扩展 WsdlDefinitionHandlerAdapter 的类来覆盖这些地址:

public class MyWsdlDefinitionHandlerAdapter extends WsdlDefinitionHandlerAdapter {

    public MyWsdlDefinitionHandlerAdapter() {}

    @Override
    protected String transformLocation(String location, HttpServletRequest request) {
        String newLocation = super.transformLocation(location, request)
                .replaceFirst("http:", "https:")
                .replaceFirst(":443", "");
        return newLocation;
}
}

并将其添加到 WebServiceConfig.java(bean 名称必须是“wsdlDefinitionHandlerAdapter”):

@Bean(name = "wsdlDefinitionHandlerAdapter")
public MyWsdlDefinitionHandlerAdapter myWsdlDefinitionHandlerAdapter() {
    return new MyWsdlDefinitionHandlerAdapter();
}

我希望有人能发现这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.