cxf wsdl2java 生成 ArrayOf<Type> 而不是 Type[]

cxf wsdl2java generating ArrayOf<Type> instead of Type[]

我正在使用 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;

我在 xsd 文件中定义的 date 数据类型遇到了类似的问题,该数据类型已转换为 XMLGregorianCalendar。但是,我通过使用外部 xjb 文件并在其中定义绑定来解决它。可以找到 here。我似乎找不到与 Array 问题类似的东西。

提前致谢。

你是说

it should be protected String[] smsIds

而实际上您的 XSD 并没有这么说。

你的XSD是说smsIDsArrayOfString类型的complexType,定义在顶部,CXF会创建一个对应的对象ArrayOfString.它里面有一个名为 string 的元素,它可以出现多次,所以你可能会在它为你的 XSD.

生成的 ArrayOfString 对象中找到你的数组/列表

如果你想删除那个包装器对象,在你的 XSD 你必须改变这个:

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

<xs:element maxOccurs="unbounded" minOccurs="0" name="smsIds" type="xsd:string"/>

好吧,看来我错过了什么。 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">