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

从Airarabia第三方WSDL生成Java文件遇多部分绑定Body错误求助

解决Air Arabia WSDL生成Java代码时的绑定警告问题

我之前也碰到过类似的非标准WSDL生成代码的坑,你的这些警告本质上是因为这个WSDL没严格遵循WS-I Basic Profile 1.1的规范——要么是把多个消息part绑定到了同一个SOAP body,要么是两个操作的请求体签名完全重复,导致代码生成工具懵了。下面是我亲测有效的解决方案:

1. 搞定"more than one part bound to body"警告

这个问题是WSDL里的操作违反了规范:一个SOAP body只能绑定一个message part。咱们可以通过自定义JAX-WS绑定文件来强制开启包装器模式,让工具自动把多个part合并成一个包装类。

第一步:写绑定文件(比如命名为jaxws-binding.xml)

<jaxws:bindings
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    wsdlLocation="http://reservations.airarabia.com/webservices/services/AAResWebServices?wsdl">

    <!-- 给book操作开包装器模式 -->
    <jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='AAResWebServices']/wsdl:operation[@name='book']">
        <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
    </jaxws:bindings>

    <!-- 其他出警告的操作依葫芦画瓢 -->
    <jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='AAResWebServices']/wsdl:operation[@name='getReservationbyPNR']">
        <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
    </jaxws:bindings>

    <jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='AAResWebServices']/wsdl:operation[@name='modifyResQuery']">
        <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
    </jaxws:bindings>

    <jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='AAResWebServices']/wsdl:operation[@name='modifyReservation']">
        <jaxws:enableWrapperStyle>true</jaxws:enableWrapperStyle>
    </jaxws:bindings>
</jaxws:bindings>

第二步:生成代码时指定这个绑定文件

如果用命令行的wsimport:

wsimport -b jaxws-binding.xml http://reservations.airarabia.com/webservices/services/AAResWebServices?wsdl

如果用Maven的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>
                <wsdlUrls>
                    <wsdlUrl>http://reservations.airarabia.com/webservices/services/AAResWebServices?wsdl</wsdlUrl>
                </wsdlUrls>
                <bindingFiles>
                    <bindingFile>src/main/resources/jaxws-binding.xml</bindingFile>
                </bindingFiles>
            </configuration>
        </execution>
    </executions>
</plugin>

2. 解决"Non unique body parts"警告

这个是getSSRDetails和getUserDefinedSSRDetails两个操作的请求体完全一样,工具担心运行时没法区分请求该发哪个方法。咱们可以给这俩操作指定不同的SOAPAction,或者用工具的自动重命名功能。

方法一:在绑定文件里加SOAPAction配置

在刚才的jaxws-binding.xml末尾加:

<!-- 给getSSRDetails指定专属SOAPAction -->
<jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='AAResWebServices']/wsdl:operation[@name='getSSRDetails']">
    <jaxws:soapAction>http://www.opentravel.org/OTA/2003/05/getSSRDetails</jaxws:soapAction>
</jaxws:bindings>

<!-- 给getUserDefinedSSRDetails另一个SOAPAction -->
<jaxws:bindings node="wsdl:definitions/wsdl:portType[@name='AAResWebServices']/wsdl:operation[@name='getUserDefinedSSRDetails']">
    <jaxws:soapAction>http://www.opentravel.org/OTA/2003/05/getUserDefinedSSRDetails</jaxws:soapAction>
</jaxws:bindings>

方法二:用Apache CXF的自动重命名

如果你用Apache CXF的wsdl2java工具,直接加-autoNameResolution参数就能让工具自动给重复的方法/类加后缀区分:

wsdl2java -autoNameResolution -b jaxws-binding.xml http://reservations.airarabia.com/webservices/services/AAResWebServices?wsdl

3. 万一还是不行的排查方向

  • 先检查绑定文件里的节点路径对不对,比如WSDL里的portType名称是不是AAResWebServices,操作名有没有拼写错
  • 把WSDL下载到本地,手动改一改(比如把多part的message改成单part,或者给重复的请求体加个不同的命名空间),再生成代码
  • 换个新版本的JAX-WS工具,比如最新的JAX-WS RI或者Apache CXF,新版本对非标准WSDL的兼容性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:25:54