WSDL同名元素类型不同致Java Stub生成失败求助
碰到这种同名不同类型的元素冲突,确实会让Java Stub生成工具犯难——毕竟它没法自动判断两个PayloadLength该映射成同一个Java字段还是不同的。给你几个实用的解决办法,按优先级排序:
1. 直接修改Schema(最省心的方案,如果你有权限的话)
这两个同名元素本质上是Schema设计的小瑕疵——既然类型不同,完全可以给它们起个能区分的名字,比如PayloadLengthStr和PayloadLengthNum。修改后生成Stub时就不会有冲突了,示例修改如下:
<xs:element name="PayloadLengthStr" type="xs:string" minOccurs="0"/> <xs:element name="PayloadLengthNum" maxOccurs="1" minOccurs="0" type="xs:int"/>
要是这个Schema是第三方提供的,先跟对方确认能不能改;如果是自己团队维护的,直接改就完事了。
2. 用绑定文件强制指定字段映射(不能改Schema时的首选)
如果碰上个不能改的第三方Schema,那就用JAX-WS的绑定文件来“告诉”生成工具怎么区分这两个元素。你可以写一个binding.xml,给每个同名元素指定不同的Java属性名:
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.0"> <jaxws:bindings schemaLocation="你的Schema文件路径.xsd"> <!-- 给string类型的PayloadLength指定Java属性名 --> <jaxb:bindings node="//xs:element[@name='PayloadLength' and @type='xs:string']"> <jaxb:property name="payloadLengthString"/> </jaxb:bindings> <!-- 给int类型的PayloadLength指定Java属性名 --> <jaxb:bindings node="//xs:element[@name='PayloadLength' and @type='xs:int']"> <jaxb:property name="payloadLengthInt"/> </jaxb:bindings> </jaxws:bindings> </jaxws:bindings>
然后生成Stub的时候带上这个绑定文件:
- 用
wsimport的话:wsimport -b binding.xml 你的WSDL文件.wsdl - 用Apache CXF的
wsdl2java:wsdl2java -b binding.xml 你的WSDL文件.wsdl
3. 检查元素的所属上下文(可能工具没自动识别)
有时候这两个PayloadLength其实属于不同的复杂类型(比如一个在请求对象里,一个在响应对象里),正常情况下生成工具应该能自动区分,但如果工具抽风了,你可以在绑定文件里针对具体的复杂类型来指定映射:
<jaxb:bindings node="//xs:complexType[@name='RequestType']//xs:element[@name='PayloadLength']"> <jaxb:property name="requestPayloadLength"/> </jaxb:bindings> <jaxb:bindings node="//xs:complexType[@name='ResponseType']//xs:element[@name='PayloadLength']"> <jaxb:property name="responsePayloadLength"/> </jaxb:bindings>
这样就能确保不同上下文里的同名元素被映射成不同的Java字段。
内容的提问来源于stack exchange,提问作者MindGame
相关产品推荐
相关产品推荐

