Axis2 reçoit toujours des paramètres nuls même si la demande SOAP est envoyée correctement?

StackOverflow https://stackoverflow.com/questions/1000578

Question

MISE À JOUR: J'AI RÉGLÉ CE PROBLÈME MAINTENANT - S'IL VOUS PLAÎT DÉFILEZ VERS LE BAS POUR PLUS D'INFORMATIONS CONCERNANT FIX

Bonjour les gars,

J'ai un service Web écrit en Java, hébergé sur un serveur Axis2 / Tomcat / Apache. Mon logiciel client est écrit en C #.

J'ai eu quelques problèmes irritants liés à la manière dont java2wsdl génère le fichier wsdl, ce qui m'a causé quelques maux de tête au début, mais avec ce problème, je suis complètement perplexe.

Ce qui se passe en réalité, c’est que le client voit correctement le service Web et envoie une demande SOAP parfaitement valide (ou du moins, elle me semble valable) avec des paramètres.

Sur le serveur, la méthode Web correcte est exécutée, mais les paramètres sont tous nuls. Mon service Web le détecte et crée une réponse que le client reçoit et comprend parfaitement.

Mon impression est qu'Axis2 tombe à plat quelque part, mais vu les maux de tête que j'ai avec java2wsdl, tout ce dont j'ai besoin est peut-être un changement dans mon fichier WSDL.

Voici le fichier WSDL:

    <?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>

Et voici un exemple de demande et de réponse:

Demande:

<?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>

Réponse

<?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>

Quelqu'un at-il une idée de ce qui pourrait mal se passer?

Le message d'erreur dans la réponse ne peut être envoyé que lorsque le paramètre de code série dans la demande est vide / nul. Je suppose donc qu'il y a un problème avec la façon dont Axis2 lit mes paramètres.

Toute aide est très appréciée.

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

COMMENT CORRIGER CECI:

Ceci est une réponse à la demande d'Aldo pour plus d'informations sur la façon dont j'ai résolu ce problème.

Je ne sais pas pourquoi ce correctif fonctionne. Peut-être s'agit-il simplement d'un bogue dans Axis2 ou de quelque chose du genre. De toute façon, YMMV car je ne sais pas si le problème vient de ma configuration ou de quelque chose d’autre. Tout ce que je peux dire, c'est qu'en procédant comme suit, tout a commencé à fonctionner.

Quoi qu'il en soit, le fichier WSDL généré automatiquement crée des types d'élément complexes pour les demandes Web et leurs paramètres, même lorsque les seuls paramètres sont des types simples tels que des chaînes ou des entiers. Ce que j'ai fait est de passer en revue et de créer les balises de type simple correctes pour les paramètres (telles que "code série" ou "date-chaîne"), puis de remplacer les références aux types complexes ailleurs dans le fichier WSDL par des références aux types simples.

Un exemple est ci-dessous:

Méthode et paramètres WSDL générés automatiquement

<!--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>

En gros, vous devez supprimer les paramètres générés automatiquement et créer des types simples. Vous modifiez ensuite les balises 'request' pour utiliser 'type' plutôt que 'élément', et vous utilisez les types simples que vous venez de créer.

WSDL modifié / fixe

<!--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>

Évidemment, cela dépend de vos paramètres. Dans mon cas, ce sont tous des types simples standard tels que des chaînes et des entiers. Si vous transmettez plus d'un paramètre, vous devrez peut-être jouer en conservant les éléments générés automatiquement, mais en vous assurant que l'élément fait référence à des types simples plutôt que d'inclure simplement l'attribut type sous la forme 'xs: string' ou quelque chose de ce genre. .

Toutes mes excuses, je ne saurais être plus clair à ce sujet, mais comme je l’ai dit plus tôt, je ne sais pas pourquoi cela fonctionne.

Une dernière chose: en supprimant l'attribut de référence 'element' dans les balises de requête, vous pouvez recevoir un avertissement d'analyse syntaxique dans vos journaux Axis2. Jusqu'à présent, cela ne m'a posé aucun problème, mais il faut en prendre conscience au cas où vous auriez des problèmes.

Était-ce utile?

La solution

J'ai résolu ce problème en parcourant mon fichier WSDL et, dans la mesure du possible, en décomposant les éléments en équivalents de types simples et en mettant à jour les références entre les éléments XML en conséquence.

Je ne sais pas pourquoi cela fonctionne, mais cela a quand même résolu mon problème.

Autres conseils

Si vous aviez un attribut complexe, voici comment vous pouvez le faire

Avant

 <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>

Après

            <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>

Et puis changez cela

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

Pour

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

Cela devrait être ça! Il l’a fait pour moi ....

Ceci n’est qu’un pressentiment, mais vous rencontrez peut-être un problème d’espace de noms. Si vous vous concentrez sur cette partie du fichier wsdl, notez que votre paramètre a la valeur "ns0". espace de noms pour les éléments, mais dans vos opérations définies plus tard, il semble que vous utilisiez un "axe2" espace de noms. Avec tous mes WSDL générés par Axis2, ces deux espaces de noms sont identiques.

<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>

Une autre chose que vous pouvez vérifier est de vérifier que le wsdl que vous avez obtenu de java2wsdl est le même que celui généré par axis2. Sauf si vous avez modifié le paramètre par défaut de & use; useoriginalwsdl " dans votre fichier services.xml, ces wsdls peuvent "regarder". différent. Je n'ai jamais eu à exécuter manuellement java2wsdl pour que mon service Web fonctionne correctement ...

Donc, en gros, tapez l'URL de votre service dans un navigateur et cliquez sur le? wsdl à la fin de l'URL ... vous devriez obtenir un wsdl pour comparer.

De plus, demandez à votre client de générer des talons à partir du wsdl du serveur au lieu de ceux générés par java2wsdl (en supposant que vous utilisiez à l'origine le wsdl de java2wsdl). Encore une fois, nous n’avons jamais eu à transmettre un fichier wsdl généré manuellement à qui que ce soit ... ils ont simplement utilisé le fichier généré dynamiquement depuis le serveur ...

Avez-vous essayé d'envoyer une demande comme celle-ci?

<?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>

Toutes mes demandes ont la balise request avant les paramètres de la demande.

essayez ceci:                        123456-654321               

Mettez xmlns = " " dans la balise de paramètre. J'ai le même problème et je ne sais pas ce que je peux modifier pour recevoir le paramètre sans le xmlnx.

J'ai un autre correctif. J'ai finalement découvert que si je ne laissais pas mon IDE (Netbeans 6.8) générer le WSDL, alors le service Web fonctionnait. Sinon, si je l'ai supprimé, décoché l'option de génération et redéployé, cela a fonctionné.

Comparaison d’un fichier WSDL généré par Netbeans à un serveur, j’ai remarqué les différences suivantes:

  • xmlns: ns0 = "http: /// xsd"
  • l'espace de nom cible situé à la fin de la balise wsdl: les définitions étaient précédées d'une barre oblique
  • ns0 utilisé pour choisir les éléments qui composent la balise wsdl: message

Supprimer tout cela et redéployer a fonctionné!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top