代码之家  ›  专栏  ›  技术社区  ›  Alexander Yakovlev

发送请求时WSDL字段名称不同

  •  1
  • Alexander Yakovlev  · 技术社区  · 6 年前

    我正在从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公司 标记名称,而不是 提供 ,这是错误的 议论 param为null,因此没有标记)。我生成的源代码很好。一流的 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=“优惠” 这是正确的。有谁能帮助我理解这个问题的根源,以及如何摆脱这个错误的命名?

    Thanx提前!

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alexander Yakovlev    6 年前

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

    ArrayOfHitOfferBase arrayOfHitOfferBase1= factoryData。createArrayOfHitOfferBase()

    代替

    JAXBElement Hitoffers优惠= factoryData。createHitOffersOffers(arrayOfHitOfferBase)

    无情地 HitOffers 使用插件接受生成后的对象 ArrayOfHitOfferBase 以及 JAXBElement<ArrayOfHitOfferBase>