我正在使用cxf-spring-boot-starter-jaxws
来编写一个简单的SOAP服务。 WSDL有一个服务和几个端口,看起来像这样
<wsdl:port name="myServiceSoap11Endpoint" binding="ns:myServiceSoap11Binding">
<soap:address location="http://example.com/services/myService.myServiceSoap11Endpoint/"/>
</wsdl:port>
<wsdl:port name="myServiceSoap12Endpoint" binding="ns:myServiceSoap12Binding">
<soap12:address location="http://example.com/services/myService.myServiceSoap12Endpoint/"/>
</wsdl:port>
这两个绑定几乎完全相同,并且指向相同的PortType。
在我的Java代码中,我使用spring boot @Configuration
机制配置端点。我为每个端口创建一个单独的端点。
// The class MyService was auto-generated by wsdl2java
@Bean
public Endpoint endpointMyServiceSoap11() {
EndpointImpl endpoint = new EndpointImpl(springBus, new MyServiceImplementor());
endpoint.setWsdlLocation(MyService.WSDL_LOCATION.toString());
endpoint.setServiceName(MyService.SERVICE);
endpoint.setEndpointName(MyService.MyServiceSoap11Endpoint);
endpoint.publish("/myService.myServiceSoap11Endpoint");
return endpoint;
}
@Bean
public Endpoint endpointMyServiceSoap12() {
EndpointImpl endpoint = new EndpointImpl(springBus, new MyServiceImplementor());
endpoint.setWsdlLocation(MyService.WSDL_LOCATION.toString());
endpoint.setServiceName(MyService.SERVICE);
endpoint.setEndpointName(MyService.MyServiceSoap12Endpoint);
endpoint.publish("/myService.myServiceSoap12Endpoint");
return endpoint;
}
这有点奏效,但是当我想要获取WSDL文件时问题就开始了。两个端点都作为单独的服务发布,并且它们都提供了自己的WSDL版本,每个端点只有一个正确的端口。
是否可以将两个端点作为公共服务的一部分发布,以便/myService?WSDL
返回带有两个端点的正确WSDL?
答案 0 :(得分:0)
经过一番干预,我发现做我想做的事是不可能的。尽管如此,至少有一种方法可以获取正确的WSDL文件。您可以使用autoRewriteSoapAddressForAllServices属性(例如像这样
endpoint.setProperties(Map.of(WSDLGetUtils.AUTO_REWRITE_ADDRESS_ALL, true))
此属性不适用于cxf.path
,但是,您需要将所有内容都放入server.servlet.contextPath
中,因为WSDL中的结果路径基本上是通过将contextPath与端点发布路径结合在一起来创建的。