0

我正在使用 cxf wsdl2java 命令行命令来生成客户端(java 文件)。我的 xsd 看起来像这样 -

<xs:complexType name="ArrayOfString">
    <xs:sequence>
        <xs:element maxOccurs="unbounded" minOccurs="0" name="string" type="xs:string"/>
    </xs:sequence>
</xs:complexType>   
<xs:element name="ConfirmSMSResults">
<xs:complexType>
    <xs:sequence>
    <xs:element maxOccurs="1" minOccurs="1" name="sessionId" type="xs:string"/>
    <xs:element maxOccurs="1" minOccurs="1" name="smsIds" type="tns:ArrayOfString"/>
    </xs:sequence>
</xs:complexType>   

生成的java文件ConfirmSMSResults.java有这样的东西

@XmlElement(required = true) protected ArrayOfString smsIds;

它应该在哪里protected String[] smsIds;

date我对文件中定义的数据类型有类似的问题xsd,它被转换为XMLGregorianCalendar. 但是,我通过使用外部xjb文件并在那里定义绑定来解决它。可以在这里找到。对于 Array 的问题,我似乎找不到类似的东西。

先感谢您。

4

2 回答 2

2

你这么说

它应该是protected String[] smsIds

事实上,你的 XSD 并没有这么说。

您的 XSD 是说它smsIDs是在顶部定义complexType的类型ArrayOfString,CXF 将创建一个相应的对象ArrayOfString。在其中有一个名为的元素string,它可以出现多次,因此您可能会在ArrayOfString它为您的 XSD 生成的对象中找到您的数组/列表。

如果要删除该包装对象,则必须在 XSD 中进行更改:

<xs:element maxOccurs="1" minOccurs="1" name="smsIds" type="tns:ArrayOfString"/>

<xs:element maxOccurs="unbounded" minOccurs="0" name="smsIds" type="xsd:string"/>
于 2016-01-20T02:03:30.303 回答
0

好吧,我好像错过了什么。该type属性是指ArrayofString对象,而不是应该是xs:string. 似乎不需要ArrayOfStrings对象。此外,maxOccurs应该等于unbounded。最终结果 -

<xs:element name="ConfirmSMSResults">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="1" minOccurs="1" name="sessionId" type="xs:string"/>
            <xs:element maxOccurs="unbounded" minOccurs="1" name="smsIds" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

我还添加collectionType="indexed"到我的 xjb 文件中。所以它现在看起来像这样<jaxb:globalBindings collectionType ="indexed">

于 2016-01-20T02:13:31.057 回答