我需要支持具有相同 URL 的多个版本的 SOAP 端点,这可能吗? Soap 类是从第三方 wsdl 生成的。
在 web.xml 中我有:
<servlet>
<servlet-name>soap</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>soap</servlet-name>
<url-pattern>/soap/*</url-pattern>
</servlet-mapping>
在我的 applicationContext.xml 中,我有以下内容:
<wss:binding url="/soap/StuffService/">
<wss:service>
<ws:service bean="#stuffV1"/>
</wss:service>
</wss:binding>
<bean id="stuffV1" class="package.soap.StuffSoapEndpointV1"/>
我有一个java类:
@WebService(
portName = "BasicHttpBinding_IStuffService",
serviceName = "StuffService",
endpointInterface = "package.soap.stuff.IStuffService",
targetNamespace = "http://stuff.example.org/Integration/Service/Outgoing/v1",
wsdlLocation = "/WEB-INF/Integration.Service.Outgoing.v1.IStuff.wsdl")
@ApiOperation(value = "Stuff Service")
public class StuffSoapEndpointV1 implements IStuffService {
是否可以向同一网址添加第二个版本?类似以下内容:
<wss:binding url="/soap/StuffService/">
<wss:service>
<ws:service bean="#stuffV1"/>
<ws:service bean="#stuffV2"/>
</wss:service>
</wss:binding>
<bean id="stuffV1" class="package.soap.StuffSoapEndpointV1"/>
<bean id="stuffV2" class="package.soap.StuffSoapEndpointV2"/>
@WebService(
portName = "BasicHttpBinding_IStuffService",
serviceName = "StuffService",
endpointInterface = "package.soap.stuff.IStuffService",
targetNamespace = "http://stuff.example.org/Integration/Service/Outgoing/v2",
wsdlLocation = "/WEB-INF/Integration.Service.Outgoing.v2.IStuff.wsdl")
@ApiOperation(value = "Stuff Service")
public class StuffSoapEndpointV2 implements IStuffService {
那是行不通的。不允许使用多个 ws:service 标记,对于具有相同 url 的 wss:service 和 wss:binding 也是如此。另外,我认为 portName 和 serviceName 组合应该是唯一的,但它们需要与不是来自我们的 wsdl 中的相同。
我为肥皂调用创建了自己的处理程序,类似于https://github.com/revinate/jaxws-spring/blob/master/jaxws-spring/src/main/java/com/sun/xml/ws/ Transport/http/servlet/WSSpringServlet.java 具有基本功能。它使用我自己的 WSServletDelegate。
<servlet>
<servlet-name>soap</servlet-name>
<servlet-class>my.application.soap.WSSpecialServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
但是我添加了 WSServletDelegate,因此它可以读取绑定 url 的多个配置,并用双星号标记。
<wss:binding url="/soap/eventService/**">
<wss:service>
<ws:service bean="#eventBeanV1"/>
</wss:service>
</wss:binding>
<wss:binding url="/soap/eventService/**">
<wss:service>
<ws:service bean="#eventBeanV2"/>
</wss:service>
</wss:binding>
当请求到达那些带有双星号的 url 时,WSServletDelegate 会将传入的 SOAPAction 标头与 beans 方法 Action 注释值进行比较,如果它们相同,则应使用该 bean。