【问题标题】:WSDL field name differs when sending request发送请求时 WSDL 字段名称不同
【发布时间】:2018-03-30 09:53:22
【问题描述】:

我正在从 Java 项目向 SOAP WS 发送请求。 通过 wsdl,我使用以下方法生成了所需的源:

<groupId>org.apache.cxf</groupId> 
<artifactId>cxf-codegen-plugin</artifactId> 
<version>3.1.6</version>

我使用的 WSDL 具有以下字段:

<xs:complexType name="HitOffers">
    <xs:sequence>
        <xs:element minOccurs="0" name="Comment" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="Offers" nillable="true" type="tns:ArrayOfHitOfferBase"/>
    </xs:sequence>
</xs:complexType>
<xs:element name="HitOffers" nillable="true" type="tns:HitOffers"/>
<xs:complexType name="ArrayOfHitOfferBase">
    <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="HitOfferBase" nillable="true"
                    type="tns:HitOfferBase"/>
    </xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfHitOfferBase" nillable="true" type="tns:ArrayOfHitOfferBase"/>
<xs:complexType name="HitOfferBase">
    <xs:sequence>
        <xs:element minOccurs="0" name="Id" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="IsExported" type="xs:boolean"/>
        <xs:element minOccurs="0" name="IsRequired" type="xs:boolean"/>
        <xs:element minOccurs="0" name="Order" type="xs:int"/>
        <xs:element minOccurs="0" name="Status" nillable="true" type="tns:OfferStatus"/>
    </xs:sequence>
</xs:complexType>

所以,在请求中我想看到类似的内容:

<b:Offers xmlns:c="http://schemas.datacontract.org/2004/07/TCSBank.Common.Model.Applications.Offers">
    <c:Comment i:nil="true"/>
    <c:Offers>
        <c:HitOfferBase
                xmlns:d="http://schemas.datacontract.org/2004/07/TCSBank.Common.Model.Applications.PreCollection.Offers.Mail"
                i:type="d:PreCollectionMailOffer">
            <c:Id>xxx</c:Id>
            <c:IsExported>false</c:IsExported>
            <c:IsRequired>true</c:IsRequired>
            <c:Order>1</c:Order>
            <c:Status i:nil="true"/>
            <d:Mail xmlns:e="http://schemas.datacontract.org/2004/07/TCSBank.Common.Model.Applications.Offers.Blocks">
                <c:BlockResult i:nil="true"/>
                <c:IsWithClarify>false</c:IsWithClarify>
                <c:Name>xxx</c:Name>
                <c:OriginalValue>mail123@yandex.ru</c:OriginalValue>
                <e:Value i:nil="true"/>
            </d:Mail>
        </c:HitOfferBase>
    </c:Offers>
</b:Offers>

但我的请求看起来有点不同:

<ns28:Offers>
<ns10:ArrayOfHitOfferBase>
    <ns10:HitOfferBase xsi:type="ns26:PreCollectionMailOffer">
        <ns10:Id>425100970</ns10:Id>
        <ns10:IsExported>false</ns10:IsExported>
        <ns10:IsRequired>true</ns10:IsRequired>
        <ns10:Order>1</ns10:Order>
        <ns20:MailOfferBlock>
            <ns10:IsWithClarify>false</ns10:IsWithClarify>
            <ns10:Name>??????? email</ns10:Name>
            <ns10:OriginalValue xsi:nil="true"/>
        </ns20:MailOfferBlock>
    </ns10:HitOfferBase>
</ns10:ArrayOfHitOfferBase>

如您所见,我们得到了 ArrayOfHitOfferBase 标记名称而不是 Offers,这是错误的(Comment 参数为空,因此没有标签)。我生成的来源很好。顶级 HitOffers 来源看起来不错:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "HitOffers", namespace = "http://schemas.datacontract.org/2004/07/TCSBank.Common.Model.Applications.Offers", propOrder = {
    "comment",
    "offers"
})
public class HitOffers {

    @XmlElementRef(name = "Comment", namespace = "http://schemas.datacontract.org/2004/07/TCSBank.Common.Model.Applications.Offers", type = JAXBElement.class)
    protected JAXBElement<String> comment;
    @XmlElementRef(name = "Offers", namespace = "http://schemas.datacontract.org/2004/07/TCSBank.Common.Model.Applications.Offers", type = JAXBElement.class)
    protected JAXBElement<ArrayOfHitOfferBase> offers;

正如您看到的字段 @XmlElementRef 属性 name = "Offers" 是正确的。谁能帮我理解问题的原因以及如何摆脱这个错误的命名?

提前谢谢!

【问题讨论】:

  • 语法错误见谅)

标签: java soap wsdl cxf cxf-codegen-plugin


【解决方案1】:

发现我的错误。 cxf-codegen-plugin 创建 ObjectFactory 类,其中包含用于创建 WSDL 对象以及 JAXBElement 对象的方法。所以我在创造

ArrayOfHitOfferBase arrayOfHitOfferBase1 = factoryData.createArrayOfHitOfferBase()

直接

JAXBElement hitOffersOffers = factoryData.createHitOffersOffers(arrayOfHitOfferBase)

不幸的是,HitOffers 对象在使用插件生成后接受 ArrayOfHitOfferBase 以及 JAXBElement&lt;ArrayOfHitOfferBase&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多