You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为基于spring-ws-core的Web服务客户端设置SOAP 1.2版本?

问题描述

我的客户端使用org.springframework.ws:spring-ws-core:4.0.11,其内部依赖Jakarta XML Web Services (JAX-WS)。我需要为同时支持SOAP 1.1和1.2协议的Web服务生成客户端代理,该代理通过wsimport Maven插件从WSDL生成。但自动生成的客户端默认使用SOAP 1.1,我需要将其改为SOAP 1.2。

当前实现代码:

var service = new TargetWebService(); // Auto-generated from WSDL
var port = service.getPort(TargetWebServiceSoap.class);  
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, properties.url());

内部绑定设置为使用SOAP 1.1,但我找不到将其改为SOAP 1.2或修改Binding创建方式的方法。

我尝试过的操作:

  • 尝试修改绑定属性,但未找到明确切换SOAP版本的文档。
  • 生成的类似乎没有配置SOAP版本的直接方法。

期望结果:强制客户端使用SOAP 1.2协议版本。


解决方案

方法1:通过Binding实例切换SOAP版本

JAX-WS的SOAPBinding提供了直接修改SOAP版本的API,你可以从BindingProvider中获取绑定实例,然后设置SOAP 1.2版本:

var service = new TargetWebService();
var port = service.getPort(TargetWebServiceSoap.class);
BindingProvider bp = (BindingProvider) port;

// 获取SOAP绑定并切换至SOAP 1.2
SOAPBinding soapBinding = (SOAPBinding) bp.getBinding();
soapBinding.setSOAPVersion(SOAPVersion.SOAP_1_2);

bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, properties.url());

注意:确保你的目标WSDL中包含SOAP 1.2的绑定定义,否则该操作可能抛出异常。

方法2:生成客户端时指定SOAP 1.2绑定

如果wsimport默认生成SOAP 1.1的客户端代码,你可以通过Maven插件配置,指定自定义绑定文件强制生成SOAP 1.2的客户端:

在pom.xml的jaxws-maven-plugin中添加绑定文件配置:

<plugin>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.3.5</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <wsdlFiles>
                    <wsdlFile>src/main/resources/your-target.wsdl</wsdlFile>
                </wsdlFiles>
                <bindingFiles>
                    <bindingFile>src/main/resources/soap12-binding.xml</bindingFile>
                </bindingFiles>
            </configuration>
        </execution>
    </executions>
</plugin>

然后创建soap12-binding.xml绑定文件,替换其中的YourBindingName为WSDL中实际的绑定名称:

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
                xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                wsdlLocation="your-target.wsdl">
    <jaxws:bindings node="wsdl:definitions/wsdl:binding[@name='YourBindingName']">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
        <jaxws:binding>
            <soap:body use="literal"/>
        </jaxws:binding>
    </jaxws:bindings>
</jaxws:bindings>

这样生成的客户端默认就会使用SOAP 1.2协议。

方法3:直接调用SOAP 1.2端口方法(如果WSDL已定义)

如果你的WSDL中同时定义了SOAP 1.1和1.2的端口,wsimport生成的TargetWebService类会自动生成对应SOAP 1.2端口的获取方法(通常命名为getXXXSoap12()),直接调用即可:

var service = new TargetWebService();
// 直接获取SOAP 1.2端口
var port = service.getTargetWebServiceSoap12();
BindingProvider bp = (BindingProvider) port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, properties.url());

内容的提问来源于stack exchange,提问作者MiguelSlv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:52:33