从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
相关产品推荐
相关产品推荐

