我使用本指南创建了一个简单的 spring-boot SOAP Web 服务: https://spring.io/guides/gs/having-web-service/
我将其部署到云服务,但前面会有一个 API 管理层。
我希望 WSDL 使用 API 管理层的 URL。 (本质上是对地址进行硬编码。)
我尝试过两种方法:
使用 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;
}
使用 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>
如何设置/覆盖
的主机名部分我认为您正在 Web 服务配置类的 messageDispatcherServlet 方法中使用 setTransformWsdlLocations(true) 。此设置将根据其运行的环境转换 URL。 删除此行,以便它将采用默认设置 fals 并且不会覆盖。
一个老问题,但我最近一直在努力解决类似的问题。我的 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();
}
我希望有人能发现这有帮助。