同一 URL 上的多个 SOAP 服务(同一 URL 的不同版本)

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

我需要支持具有相同 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 中的相同。

java spring soap jax-ws
1个回答
0
投票

我为肥皂调用创建了自己的处理程序,类似于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。

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