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

时间:2016-01-20 01:08:09

标签: java xml xsd cxf xjb

我正在使用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文件并在那里定义绑定来解决它。可以找到here。我似乎无法找到与我的Array问题类似的东西。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

你在说那个

  

应为protected String[] smsIds

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

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

如果要删除该包装器对象,在XSD中必须更改它:

ArrayOfString

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

答案 1 :(得分:0)

好吧,好像我错过了什么。 if review.product.has_coupon_codes? if CouponCodeService.assign_coupon(review) # this is false if !review.coupon.nil? # this is false review.approve! # this is some how executed. success_message(review) review.send_reviewer_approved_email else review.update(aasm_state: 'requested') error_message(review) end else review.update(aasm_state: 'requested') error_message(review) end end def self.assign_coupon(review) begin product = review.product if product.has_coupon_codes? coupon = product.coupons.where(claimed: false).first coupon.review_id = review.id coupon.claimed = true if coupon.save return true else return false end else return false end rescue Exception => e return false end end 属性引用type对象,而应该是ArrayofString。似乎不需要xs:string个对象。此外,ArrayOfStrings应该等于maxOccurs。最终结果 -

unbounded

我还在我的xjb文件中添加了<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"