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

使用wsimport生成GetHotelMediaRQ的Java代码失败,求助解决方案

嘿,这个问题我之前帮不少人解决过——你碰到的是wsimport处理Sabre这类复杂WSDL时常见的类型重复定义冲突,具体是因为GetHotelMediaRQ_v2.0.0.wsdl引用的响应XSD(GetHotelMediaRS_v2.0.0.xsd)里,和请求侧的XSD有同名的HotelMediaInfos复杂类型,wsimport默认会把所有依赖XSD的类型合并生成,自然就撞车了。

给你几个可行的解决办法,按优雅程度排序:

方法1:使用绑定文件自定义类型映射(推荐)

这是最规范的方式,不需要修改原始WSDL/XSD,通过JAXB绑定规则给重复类型指定不同的Java类名:

  1. 先把目标WSDL和相关的XSD文件都下载到本地目录(比如./sabre-wsdl),确保所有依赖的XSD都能被本地访问到(如果WSDL里引用的XSD有相对路径,要保持目录结构一致)。
  2. 创建一个binding.xml文件,内容如下:
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
                xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                version="2.1">
    <jaxws:bindings wsdlLocation="./sabre-wsdl/GetHotelMediaRQ_v2.0.0.wsdl">
        <!-- 给请求侧的HotelMediaInfos指定自定义类名 -->
        <jaxb:bindings node="//xsd:complexType[@name='HotelMediaInfos' and ancestor::xsd:schema[@targetNamespace='http://webservices.sabre.com/sabreXML/2011/10']]">
            <jaxb:class name="HotelMediaInfosRQ"/>
        </jaxb:bindings>
        <!-- 给响应侧的HotelMediaInfos指定另一个类名 -->
        <jaxb:bindings node="//xsd:complexType[@name='HotelMediaInfos' and ancestor::xsd:schema[@targetNamespace='http://webservices.sabre.com/sabreXML/2011/10']]">
            <!-- 注意:要根据你下载的XSD实际命名空间调整XPath,确保精准定位 -->
            <jaxb:class name="HotelMediaInfosRS"/>
        </jaxb:bindings>
    </jaxws:bindings>
</jaxws:bindings>
  1. 修改wsimport命令,加入绑定文件参数,使用本地WSDL:
wsimport -target 2.1 -keep -d /Users/jinli/Tmp/ws/classes -s . -p org.jellylab.soap.sacs.proto -b binding.xml ./sabre-wsdl/GetHotelMediaRQ_v2.0.0.wsdl

方法2:手动修改XSD文件(应急用)

如果绑定文件的XPath不好精准定位,也可以直接修改本地的XSD文件:把其中一个HotelMediaInfos的名字改成唯一的(比如HotelMediaInfosRS),然后同步修改WSDL里对应的引用。不过这种方法的缺点是后续WSDL更新时,你需要重新修改,维护成本较高。

方法3:先生成源码再手动调整

使用-Xnocompile参数让wsimport只生成Java源码,不编译:

wsimport -target 2.1 -keep -Xnocompile -s . -p org.jellylab.soap.sacs.proto 'http://webservices.sabre.com/wsdl/sabreXML1.0.00/VCMP/GetHotelMediaRQ_v2.0.0.wsdl'

然后找到生成的重复类文件,手动修改类名和相关引用。这种方法适合临时快速解决,但同样维护性差。

另外提一句:如果你的JDK版本比较新,wsimport可能已经被标记为 deprecated,推荐改用Apache CXF的wsdl2java命令,它处理复杂WSDL的能力更强,解决这类冲突也更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:59:24