Служба Java - ответы SOAP всегда возвращают значение NULL - PullRequest
1 голос
/ 25 апреля 2019

У меня есть служба SOAP 1.1, разработанная с использованием Spring Boot на Java, которая без проблем отвечает на любые мои запросы и доставляет действительный SOAP-ответ.

Теперь проблема заключается в том, как только я добавляю эту службув качестве ссылки на службу для любого проекта .NET / C # ссылка создается, и я могу отправлять запросы, но ответ (который определенно отправляется из моей SOAP-службы) не может быть отображен обратно, и объект в моем приложении .NET всегда равен нулю.

Я уже выяснил, в чем может быть проблема, но я не знаю точно, как (если это вообще возможно) изменить мой xsd / wsdl для правильной генерации всех источников.

Прежде всего, это мой .xsd из моего проекта Java Spring Boot для генерации WSDL и справочника по сервисам:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://atu.de/soaptransformer/base"
           xmlns:tns="http://atu.de/soaptransformer/base"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           jaxb:version="1.0">

    <xs:complexType name="ArrayOfMessages">
        <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="message" nillable="true"
                        type="tns:AppDataMessageData"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AppDataMessageData">
        <xs:sequence>
            <xs:element name="messageCode" type="xs:int"/>
            <xs:element name="messageText" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataMessageData" nillable="true" type="tns:AppDataMessageData"/>
    <xs:complexType name="AppDataHeaderData">
        <xs:sequence>
            <xs:element name="authorization" type="xs:string"/>
            <xs:element name="branchNumber" type="xs:string"/>
            <xs:element name="mainSystemOrderNumber" type="xs:string"/>
            <xs:element name="callMode" type="xs:string"/>
            <xs:element name="damageType" type="xs:string"/>
            <xs:element name="misc1" type="xs:string"/>
            <xs:element name="misc2" type="xs:string"/>
            <xs:element name="countryRegionId" type="xs:string"/>
            <xs:element name="messages" type="tns:ArrayOfMessages"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataHeaderData" nillable="true" type="tns:AppDataHeaderData"/>
    <xs:complexType name="ArrayOfPositions">
        <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="position" nillable="true"
                        type="tns:AppDataPositionData"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AppDataPositionData">
        <xs:sequence>
            <xs:element name="inventTransId" type="xs:string"/>
            <xs:element name="positionNumber" type="xs:int"/>
            <xs:element name="itemId" type="xs:string"/>
            <xs:element name="itemType" type="xs:string"/>
            <xs:element name="articleDescription" type="xs:string"/>
            <xs:element name="deleteFlag" type="xs:boolean"/>
            <xs:element name="itemPosType" type="xs:string"/>
            <xs:element name="itemParentId" type="xs:string"/>
            <xs:element name="installDuration" type="xs:double"/>
            <xs:element name="misc" type="xs:string"/>
            <xs:element name="messages" type="tns:ArrayOfMessages"/>
            <xs:element name="quantity" type="xs:double"/>
            <xs:element name="salesPrice" type="xs:double"/>
            <xs:element name="lineDiscAuto" type="xs:double"/>
            <xs:element name="lineDiscMan" type="xs:double"/>
            <xs:element name="lineDiscEmpl" type="xs:double"/>
            <xs:element name="lineAmount" type="xs:double"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataPositionData" nillable="true" type="tns:AppDataPositionData"/>
    <xs:complexType name="AppDataInsuranceData">
        <xs:sequence>
            <xs:element name="retention" type="xs:double"/>
            <xs:element name="policyNumber" type="xs:string"/>
            <xs:element name="lossNumber" type="xs:string"/>
            <xs:element name="directPlacing" type="xs:boolean"/>
            <xs:element name="inputTaxDeduction" type="xs:boolean"/>
            <xs:element name="lossDate" type="xs:string"/>
            <xs:element name="arranger" type="xs:string"/>
            <xs:element name="retentionRenounceWorkshop" type="xs:double"/>
            <xs:element name="retentionRenounceInsurance" type="xs:double"/>
            <xs:element name="transmitted" type="xs:boolean"/>
            <xs:element name="automatedCDVProvided" type="xs:boolean"/>
            <xs:element name="insuranceDamageCauseDesc" type="xs:string"/>
            <xs:element name="insuranceDamageDesc" type="xs:string"/>
            <xs:element name="costCovered" type="xs:boolean"/>
            <xs:element name="costCoveringCheckState" type="xs:string"/>
            <xs:element name="messages" type="tns:ArrayOfMessages"/>
            <xs:element name="directPayer" type="xs:boolean"/>
            <xs:element name="insuranceDamageType" type="xs:string"/>
            <xs:element name="insuranceDebitorNumber" type="xs:int"/>
            <xs:element name="insuranceName" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataInsuranceData" nillable="true" type="tns:AppDataInsuranceData"/>
    <xs:complexType name="AppDataCustomerData">
        <xs:sequence>
            <xs:element name="custAccount" type="xs:string"/>
            <xs:element name="custAccountDBM" type="xs:string"/>
            <xs:element name="authorizationId" type="xs:string"/>
            <xs:element name="noticeId" type="xs:string"/>
            <xs:element name="flagDNEPost" type="xs:boolean"/>
            <xs:element name="flagDNEElec" type="xs:boolean"/>
            <xs:element name="custGroup" type="xs:string"/>
            <xs:element name="approvalNo" type="xs:string"/>
            <xs:element name="leasingNo" type="xs:string"/>
            <xs:element name="messages" type="tns:ArrayOfMessages"/>
            <xs:element name="salutation" type="xs:string"/>
            <xs:element name="firstName" type="xs:string"/>
            <xs:element name="lastName" type="xs:string"/>
            <xs:element name="company" type="xs:string"/>
            <xs:element name="zipCode" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="street" type="xs:string"/>
            <xs:element name="addressHouseNumber" type="xs:string"/>
            <xs:element name="addressHouseNumberAdd" type="xs:string"/>
            <xs:element name="phone" type="xs:string"/>
            <xs:element name="mobil" type="xs:string"/>
            <xs:element name="telefax" type="xs:string"/>
            <xs:element name="email" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataCustomerData" nillable="true" type="tns:AppDataCustomerData"/>
    <xs:complexType name="AppDataVehicleData">
        <xs:sequence>
            <xs:element name="vehicleId" type="xs:string"/>
            <xs:element name="licenseNumber" type="xs:string"/>
            <xs:element name="vin" type="xs:string"/>
            <xs:element name="atuKtypNr" type="xs:int"/>
            <xs:element name="tecDocKtypNr" type="xs:int"/>
            <xs:element name="kba1" type="xs:string"/>
            <xs:element name="kba2" type="xs:string"/>
            <xs:element name="kba3" type="xs:string"/>
            <xs:element name="kba32" type="xs:string"/>
            <xs:element name="natCode" type="xs:string"/>
            <xs:element name="mileage" type="xs:int"/>
            <xs:element name="registrationDate" type="xs:string"/>
            <xs:element name="categoryId" type="xs:string"/>
            <xs:element name="manufacturerName" type="xs:string"/>
            <xs:element name="modelName" type="xs:string"/>
            <xs:element name="messages" type="tns:ArrayOfMessages"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataVehicleData" nillable="true" type="tns:AppDataVehicleData"/>
    <xs:complexType name="AppDataMiscData">
        <xs:sequence>
            <xs:element name="EmplName" type="xs:string"/>
            <xs:element name="messages" type="tns:ArrayOfMessages"/>
            <xs:element name="IntDummy_1" type="xs:int"/>
            <xs:element name="IntDummy_2" type="xs:int"/>
            <xs:element name="IntDummy_3" type="xs:int"/>
            <xs:element name="IntDummy_4" type="xs:int"/>
            <xs:element name="IntDummy_5" type="xs:int"/>
            <xs:element name="DoubleDummy_1" type="xs:double"/>
            <xs:element name="DoubleDummy_2" type="xs:double"/>
            <xs:element name="DoubleDummy_3" type="xs:double"/>
            <xs:element name="DoubleDummy_4" type="xs:double"/>
            <xs:element name="DoubleDummy_5" type="xs:double"/>
            <xs:element name="StringDummy_1" type="xs:string"/>
            <xs:element name="StringDummy_2" type="xs:string"/>
            <xs:element name="StringDummy_3" type="xs:string"/>
            <xs:element name="StringDummy_4" type="xs:string"/>
            <xs:element name="StringDummy_5" type="xs:string"/>
            <xs:element name="BooleanDummy_1" type="xs:boolean"/>
            <xs:element name="BooleanDummy_2" type="xs:boolean"/>
            <xs:element name="BooleanDummy_3" type="xs:boolean"/>
            <xs:element name="BooleanDummy_4" type="xs:boolean"/>
            <xs:element name="BooleanDummy_5" type="xs:boolean"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataMiscData" nillable="true" type="tns:AppDataMiscData"/>
    <xs:complexType name="ArrayOfAdditionals">
        <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="additional" nillable="true"
                        type="tns:AppDataAdditionalData"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="AppDataAdditionalData">
        <xs:sequence>
            <xs:element name="data1" type="xs:string"/>
            <xs:element name="data2" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="AppDataAdditionalData" nillable="true" type="tns:AppDataAdditionalData"/>
    <xs:complexType name="AppDataDataRequest">
        <xs:sequence>
            <xs:element name="headerData" type="tns:AppDataHeaderData"/>
            <xs:element name="positions" type="tns:ArrayOfPositions"/>
            <xs:element name="insuranceData" type="tns:AppDataInsuranceData"/>
            <xs:element name="customerData" type="tns:AppDataCustomerData"/>
            <xs:element name="vehicleData" type="tns:AppDataVehicleData"/>
            <xs:element name="miscData" type="tns:AppDataMiscData" form="unqualified"/>
            <xs:element name="additionals" type="tns:ArrayOfAdditionals" form="unqualified"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="processingRequest">
        <xs:sequence>
            <xs:element name="AppDataDataRequest" type="tns:AppDataDataRequest"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="processingRequest" nillable="true" type="tns:processingRequest"/>
    <xs:complexType name="AppDataDataResult">
        <xs:sequence>
            <xs:element name="headerData" type="tns:AppDataHeaderData"/>
            <xs:element name="positions" type="tns:ArrayOfPositions"/>
            <xs:element name="insuranceData" type="tns:AppDataInsuranceData"/>
            <xs:element name="customerData" type="tns:AppDataCustomerData"/>
            <xs:element name="vehicleData" type="tns:AppDataVehicleData"/>
            <xs:element name="miscData" type="tns:AppDataMiscData"/>
            <xs:element name="additionals" type="tns:ArrayOfAdditionals"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="processingResponse">
        <xs:sequence>
            <xs:element name="AppDataDataResult" type="tns:AppDataDataResult"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="processingResponse" nillable="true" type="tns:AppDataDataResult"/>
</xs:schema>

Вот код из сгенерированного справочника по сервисам из Visual Studio в проекте C #:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://atu.de/soaptransformer/base/processing", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://atu.de/soaptransformer/base", IsNullable=true)]
public processingResponse processing([System.Xml.Serialization.XmlElementAttribute(Namespace="http://atu.de/soaptransformer/base", IsNullable=true)] processingRequest processingRequest) {
    object[] results = this.Invoke("processing", new object[] {
        processingRequest});
    return ((processingResponse)(results[0]));
}

Я узнал, изменил ли я следующую строку

[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://atu.de/soaptransformer/base", IsNullable=true)]

и добавил "Form = System.Xml.Schema.XmlSchemaForm.Unqualified ":

[return: System.Xml.Serialization.XmlElementAttribute("processingResponse", Namespace="http://atu.de/soaptransformer/base", IsNullable=true, Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]

Ответ правильно сопоставлен с моим Объектом, и в данный момент он работает без проблем.

Проблема в том, что я хочу изменить свой .xsd для правильной генерации этих источников с самого начала - я уже пытался добавить Form = Unqualified к элементу «AppDataDataResult» внутри complexType «processingResponse», но он не работает.

Добавление этого свойства непосредственно к элементу processingResponse не работает, либо потому, что это невозможно, поскольку один уровень ниже определения / тега схемы.

Я не нашел какого-либо конкретного решения для этогопроблема, потому что она кажется очень специфичной для Spring Boot Framework Java и генерации wsdl.

Я надеюсь, что кто-то может мне помочь с этой проблемой, потому что она не кажется большой (только для нее)«атрибут, который нужно добавить во время генерации источников), но я не могу найти решение этой проблемы.Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 26 апреля 2019

Я нашел проблему, и это было действительно простое решение для этой проблемы - в моем проекте Spring Boot я возвращал JAXBElements, а параметром для ответа является «QName», который указывает на объект ответа.Проблема заключалась в том, что у SOAP-Response не было соответствующего пространства имен для идентификации объекта во время генерации источников в .NET.Поэтому я добавил правильный URI пространства имен в QName-Object, и теперь объекты разрешаются и возвращают правильные ответы:

final QName qname = new QName(NAMESPACE_URI, "processingResponse");
return new JAXBElement<>(qname, ProcessingResponse.class, processingResponse);

В конце концов, это была довольно глупая / простая проблема, но я попробовал все остальноено не пытался наиболее очевидным / самым простым.

...