Frage

UPDATE: Ich habe jetzt dieses Problem gelöst - BITTE NACH UNTEN FÜR INFORMATIONEN ÜBER FIX SCROLL

Hallo Jungs,

Ich habe einen Web-Service in Java geschrieben, auf einem Axis2 / Tomcat / Apache-Server gehostet. Meine Client-Software ist in C # geschrieben.

Ich habe ein paar irritierenden Probleme mit der Art und Weise Java2WSDL hatte die WSDL-Datei erzeugt, das mir einige Kopfschmerzen früh verursachte, aber mit diesem Problem, das ich bin völlig ratlos.

Im Grunde, was passiert ist, dass der Client der Web-Service in Ordnung sieht, und sendet eine vollkommen gültig (oder zumindest sieht es gültig mir) SOAP-Anforderung mit Parametern.

Auf dem Server wird die korrekte Web-Methode ausgeführt, aber die Parameter sind alle null. Mein Web-Service erkennt dies und eine Antwort aufbaut, die der Client empfängt und versteht das sehr gut.

Meine Vermutung ist, dass Axis2 flach auf sein Gesicht fällt irgendwo, aber die Kopfschmerzen I mit Java2WSDL gehabt haben, vielleicht alles was ich brauche eine Veränderung in meinem WSDL-Datei ist.

Hier ist die WSDL-Datei:

    <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:axis2="http://stws/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:ns0="http://stws/xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://stws/">
    <wsdl:types>
        <xs:schema xmlns:ns="http://stws/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://stws/xsd">
            <xs:element name="GetGroups">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="GetGroupsResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ns0:Group"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:complexType name="Group">
                <xs:sequence>
                    <xs:element minOccurs="0" name="ID" type="xs:int"/>
                    <xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
            <xs:element name="GetMessages">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="groupids" type="xs:int"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="GetMessagesResponse">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" name="return" nillable="true" type="ns0:Message"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:complexType name="Message">
                <xs:sequence>
                    <xs:element minOccurs="0" name="date" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="group" type="xs:int"/>
                    <xs:element minOccurs="0" name="messageID" type="xs:int"/>
                    <xs:element minOccurs="0" name="text" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
    <wsdl:message name="GetMessagesRequest">
        <wsdl:part name="parameters" element="ns0:GetMessages"/>
    </wsdl:message>
    <wsdl:message name="GetMessagesResponse">
        <wsdl:part name="parameters" element="ns0:GetMessagesResponse"/>
    </wsdl:message>
    <wsdl:message name="GetGroupsRequest">
        <wsdl:part name="parameters" element="ns0:GetGroups"/>
    </wsdl:message>
    <wsdl:message name="GetGroupsResponse">
        <wsdl:part name="parameters" element="ns0:GetGroupsResponse"/>
    </wsdl:message>
    <wsdl:portType name="MyProjectPortType">
        <wsdl:operation name="GetMessages">
            <wsdl:input message="axis2:GetMessagesRequest" wsaw:Action="urn:GetMessages"/>
            <wsdl:output message="axis2:GetMessagesResponse" wsaw:Action="urn:GetMessagesResponse"/>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <wsdl:input message="axis2:GetGroupsRequest" wsaw:Action="urn:GetGroups"/>
            <wsdl:output message="axis2:GetGroupsResponse" wsaw:Action="urn:GetGroupsResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="MyProjectSOAP11Binding" type="axis2:MyProjectPortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="GetMessages">
            <soap:operation soapAction="urn:GetMessages" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <soap:operation soapAction="urn:GetGroups" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MyProjectSOAP12Binding" type="axis2:MyProjectPortType">
        <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="GetMessages">
            <soap12:operation soapAction="urn:GetMessages" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <soap12:operation soapAction="urn:GetGroups" style="document"/>
            <wsdl:input>
                <soap12:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap12:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:binding name="MyProjectHttpBinding" type="axis2:MyProjectPortType">
        <http:binding verb="POST"/>
        <wsdl:operation name="GetMessages">
            <http:operation location="MyProject/GetMessages"/>
            <wsdl:input>
                <mime:content type="text/xml" part="GetMessages"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="GetMessages"/>
            </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="GetGroups">
            <http:operation location="MyProject/GetGroups"/>
            <wsdl:input>
                <mime:content type="text/xml" part="GetGroups"/>
            </wsdl:input>
            <wsdl:output>
                <mime:content type="text/xml" part="GetGroups"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="MyProject">
        <wsdl:port name="MyProjectSOAP11port_http" binding="axis2:MyProjectSOAP11Binding">
            <soap:address location="http://localhost:8080/axis2/services/MyProject"/>
        </wsdl:port>
        <wsdl:port name="MyProjectSOAP12port_http" binding="axis2:MyProjectSOAP12Binding">
            <soap12:address location="http://localhost:8080/axis2/services/MyProject"/>
        </wsdl:port>
        <wsdl:port name="MyProjectHttpport" binding="axis2:MyProjectHttpBinding">
            <http:address location="http://localhost:8080/axis2/services/MyProject"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Und hier ist ein Beispiel für Anfrage und Antwort:

Anfrage:

<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <GetGroups xmlns="http://stws/xsd">
      <serialcode>123456-654321</serialcode>
    </GetGroups>
  </soap:Body>
</soap:Envelope>

Antwort

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <GetGroupsResponse xmlns="http://stws/xsd">
      <return>
        <ID>-101</ID>
        <name>ERROR: Empty Serial</name>
      </return>
    </GetGroupsResponse>
  </soapenv:Body>
</soapenv:Envelope>

Hat jemand eine Ahnung, was schief gehen könnte?

Die Fehlermeldung in der Antwort kann nur gesendet werden, wenn der serialcode Parameter in der Anfrage ist leer / null, so vermute ich, es ist etwas falsch mit, wie Axis2 meine Parameter liest.

Jede Hilfe ist sehr geschätzt.

=============================================== =============

Wie dieses Problem zu beheben:

Dies ist als Reaktion auf Aldo Wunsch für weitere Informationen darüber, wie ich dieses Problem behoben.

Ich bin nicht sicher, warum dieses Update funktioniert - vielleicht ist es nur ein Fehler in Axis2 oder so etwas. So oder so, YMMV wie ich weiß nicht, ob das Problem durch meinen Setup oder etwas anderes verursacht wurde. Alles, was ich sagen kann, ist, dass die folgenden, indem Sie, alles zu arbeiten begann.

Wie auch immer, die automatisch generierte WSDL-Datei erstellt komplexe Elementtypen für Web-Anfragen und deren Parameter, auch wenn die einzigen Parameter, einfache Typen wie Strings oder ganze Zahlen sind. Was ich tat, war gehen und schaffen die richtigen einfachen-Typ-Tags für Parameter (wie ‚serialcode‘ oder ‚Datum-string‘), dann ersetzen die Verweise auf die komplexen Typen an anderer Stelle in der WSDL-Datei mit Verweisen auf die einfachen Typen.

Ein Beispiel ist unter:

Auto generiert WSDL-Methode und Parameter

<!--Requests-->    
<wsdl:message name="RegisterClientRequest">
    <wsdl:part name="parameters" element="ns0:RegisterClient"/>
</wsdl:message>
<wsdl:message name="GetGroupsRequest">
    <wsdl:part name="parameters" element="ns0:GetGroups"/>
</wsdl:message>

<!--Parameters-->
<xs:element name="RegisterClient">
    <xs:complexType>
        <xs:sequence>
           <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="GetGroups">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="0" name="serialcode" nillable="true" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
 </xs:element>

Im Grunde, was Sie tun sollten, ist es, die automatisch generierten Parameter verwerfen und einfach Typen erstellen. Sie ändern Sie dann die ‚request‘ Tags ‚type‘ zu verwenden und nicht als ‚Element‘, und verwenden Sie Ihre neu erstellte einfache Typen.

Modifizierte / Fixed WSDL

<!--Requests-->    
<wsdl:message name="RegisterClientRequest">
    <wsdl:part name="parameters" type="ns0:SerialCode"/>
</wsdl:message>
<wsdl:message name="GetGroupsRequest">
    <wsdl:part name="parameters" type="ns0:SerialCode"/>
</wsdl:message>

<!--Parameters-->
<xs:simpleType name="SerialCode">
    <xs:restriction base="xs:string"/>
</xs:simpleType>

Natürlich hängt es davon ab, was Ihre Parameter tatsächlich sind. In meinem Fall sind sie alle Standards einfache Typen wie Strings und Zahlen. Wenn Sie mehr als einen Parameter sind vorbei, müssen Sie möglicherweise durch Beibehaltung der automatisch generierten Elemente spielen, um aber darauf achten, dass das Element auf einfache Typen bezieht sich nicht nur mit dem type-Attribut als ‚xs: string‘ oder etwas in der Natur .

Apologies Ich kann nicht mehr klar zu diesem Thema, aber wie ich bereits sagte -. Ich weiß nicht, warum das funktioniert

Eine letzte Sache: Durch das Entfernen des ‚Elements‘ Referenzattribut in den Anforderungs tags - Sie können einen Parser Warnung in Ihrem Axis2-Protokolle erhalten. Bisher hat dies nicht verursacht mir keine Probleme, aber es ist etwas bewusst zu sein, wenn Sie laufen in Schwierigkeiten.

War es hilfreich?

Lösung

Ich löste dieses Problem, indem sie durch meine WSDL-Datei zu gehen und, soweit möglich, Elemente in ihren einfache Art Pendants Abbau und die Verweise zwischen den XML-Elementen entsprechend zu aktualisieren.

Ich bin nicht sicher, warum das funktioniert, aber es hat mein Problem irgendwie gelöst werden.

Andere Tipps

Wenn Sie ein komplexes Attribut haben dies, wie Sie könnte es tun

Vor

 <xs:element name="getMyMenu">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="number" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var2" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var3" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var4" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

Nach

            <xs:complexType name="getMyMenu">
                <xs:sequence>
                    <xs:element minOccurs="0" name="number" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var2" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var3" nillable="true" type="xs:string"/>
                    <xs:element minOccurs="0" name="var4" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

Und dann dies ändern

<wsdl:message name="getMyMenuRequest">
    <wsdl:part name="parameters" type="ns0:getUssdMenu"/>
</wsdl:message>

<wsdl:message name="getMyMenuRequest">
    <wsdl:part name="parameters" type="ns:getUssdMenu"/>
</wsdl:message>

Das sollte es sein! Es hat es für mich ....

Das ist nur eine Ahnung, aber vielleicht sind Sie ein Namespace Problem haben. Wenn Sie auf diesem Teil des Wsdl konzentrieren, feststellen, dass Ihre Parameter eine „ns0“ Namespace für die Elemente, aber in Ihrem Betrieb später definiert ist, sieht es aus wie Sie einen „Axis2“ Namespace verwenden. Mit all meiner Axis2 erzeugt WSDLs sind diese beiden Namensräumen gleich.

<wsdl:message name="GetMessagesRequest">
    <wsdl:part name="parameters" element="ns0:GetMessages"/>
</wsdl:message>
<wsdl:message name="GetMessagesResponse">
    <wsdl:part name="parameters" element="ns0:GetMessagesResponse"/>
</wsdl:message>
<wsdl:message name="GetGroupsRequest">
    <wsdl:part name="parameters" element="ns0:GetGroups"/>
</wsdl:message>
<wsdl:message name="GetGroupsResponse">
    <wsdl:part name="parameters" element="ns0:GetGroupsResponse"/>
</wsdl:message>

<wsdl:portType name="MyProjectPortType">
    <wsdl:operation name="GetMessages">
        <wsdl:input message="axis2:GetMessagesRequest" wsaw:Action="urn:GetMessages"/>
        <wsdl:output message="axis2:GetMessagesResponse" wsaw:Action="urn:GetMessagesResponse"/>
    </wsdl:operation>
    <wsdl:operation name="GetGroups">
        <wsdl:input message="axis2:GetGroupsRequest" wsaw:Action="urn:GetGroups"/>
        <wsdl:output message="axis2:GetGroupsResponse" wsaw:Action="urn:GetGroupsResponse"/>
    </wsdl:operation>
</wsdl:portType>

Eine andere Sache, die Sie überprüfen können, ist zu überprüfen, ob die Wsdl Sie von Java2WSDL bekam die gleiche ist, die von axis2 erzeugt wird. Sofern Sie nicht die Standardeinstellung „useoriginalwsdl“ in Ihrem services.xml geändert haben, kann diese WSDLs „Blick“ anders. Ich hatte nie manuell eine Java2WSDL auszuführen meine Webservice zu erhalten richtig zu funktionieren ...

Also im Grunde, treffen Sie Ihre Service-URL in einem Browser und Tack auf das? Wsdl am Ende der URL ... sollten Sie eine WSDL-Datei zum Vergleich willen erhalten.

Außerdem haben Ihre Client generieren Stubs aus der WSDL-Datei des Servers statt eines, das durch Java2WSDL erzeugt wird (vorausgesetzt, ursprünglich Sie die WSDL-Datei von Java2WSDL verwendet). Auch wir nie die dynamisch erzeugte verbraucht eine manuell erzeugte Wsdl um jedem ... sie einfach nur passieren musste vom Server ...

Haben Sie versucht, eine Anfrage wie diese zu schicken?

<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <request>
      <GetGroups xmlns="http://stws/xsd">
        <serialcode>123456-654321</serialcode>
      </GetGroups>
    </request>
  </soap:Body>
</soap:Envelope>

Alle meine Wünsche haben die Anfrage Tag vor dem eigentlichen Anforderungsparameter.

versuchen Sie dies:                        123456-654321               

Setzen Sie xmlns = "" in den Parameter-Tag. Ich habe das gleiche Problem, und ich weiß nicht, was ich ändern, um die Parameter whitout der xmlnx zu erhalten.

Ich habe eine andere Lösung. Ich entdeckte schließlich, dass, wenn ich nicht lasse meine IDE (Netbeans 6.8) erzeugen, um die WSDL dann die Web-Service gearbeitet. Alternativ, wenn ich es gelöscht, unticked die Option erzeugen und wieder eingesetzt, dann hat es funktioniert.

ein Netbeans generierte WSDL an einen Server Vergleicht man erzeugt bemerkte ich, die folgenden Unterschiede:

  • xmlns: ns0 = "http: /// xsd"
  • Ziel-Namensraum am Ende des wsdl: Definitionen Tages hatte einen Schrägstrich
  • ns0 verwendet, um die Elemente zu wählen, die die WSDL bilden: Message-Tag

All diese aus- und wieder Entfalten gearbeitet!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top