IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

[AXIS2] Envoi d'un type complexe dans une requête SOAP


Sujet :

Services Web Java

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut [AXIS2] Envoi d'un type complexe dans une requête SOAP
    Bonjour,

    J'ai créé un web service avec AXIS2, mais j'obtiens une erreur en réponse lors de son appel lorsque j'essaie d'envoyer un type complexe (j'arrive à envoyer un String et à avoir une réponse). Voici l'erreur que j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <faultstring>
    org.apache.axis2.databinding.ADBException: Unexpected subelement passager
    </faultstring>
    Je souhaite envoyer un objet complexe "passager" à mon web service, celui-ci doit faire un traitement et me renvoyer un (ou plusieurs) objet(s) complexe(s) "passager".

    Voici le fichier wsdl de mon web service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    <wsdl:definitions name="avionWS" targetNamespace="localhost">
     
    <wsdl:types>
    <xsd:schema targetNamespace="localhost">
     
    <xsd:element name="Optimisation">
    <xsd:complexType>
    <xsd:sequence maxOccurs="1" minOccurs="1">
    <xsd:element name="passager" type="tns:Passager"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
     
    <xsd:element name="OptimisationResponse">
    <xsd:complexType>
    <xsd:sequence maxOccurs="unbounded" minOccurs="0">
    <xsd:element name="passagerReponse" type="tns:Passager"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
     
    <xsd:complexType name="Passager">
    <xsd:sequence>
    <xsd:element name="id" type="xsd:string"/>
    <xsd:element name="groupe" type="xsd:string"/>
    <xsd:element name="siege" type="xsd:string"/>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:schema>
    </wsdl:types>
     
     
    <wsdl:message name="OptimisationRequest">
    <wsdl:part name="parameters" element="tns:Optimisation">
    </wsdl:part>
    </wsdl:message>
     
    <wsdl:message name="OptimisationResponse">
    <wsdl:part name="parameters" element="tns:OptimisationResponse">
    </wsdl:part>
    </wsdl:message>
     
    <wsdl:portType name="avionWS">
    <wsdl:operation name="Optimisation">
    <wsdl:input message="tns:OptimisationRequest"></wsdl:input>
    <wsdl:output message="tns:OptimisationResponse"></wsdl:output>
    </wsdl:operation>
    </wsdl:portType>
     
    <wsdl:binding name="avionWSSOAP" type="tns:avionWS">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="Optimisation">
    <soap:operation soapAction="localhost/Optimisation"/>
    <wsdl:input>
    <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
    <soap:body use="literal"/>
    </wsdl:output>
    </wsdl:operation>
    </wsdl:binding>
     
    <wsdl:service name="avionWS">
    <wsdl:port name="avionWSSOAP" binding="tns:avionWSSOAP">
    <soap:address location="http://127.0.0.1:8180/axis2/services/avionWS"/>
    </wsdl:port>
    </wsdl:service>
    </wsdl:definitions>
    Voici la requête SOAP que j'envoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
    <Optimisation xmlns="http://localhost">
    <passager>
    <id>AAA</id>
    <groupe>BBB</groupe>
    <siege>CCC</siege>
    </passager>
    </Optimisation>
    </soapenv:Body>
    </soapenv:Envelope>
    Et voici la réponse obtenue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version='1.0' encoding='utf-8'?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
    <soapenv:Fault>
    <faultcode>soapenv:Server</faultcode>
    <faultstring>
    org.apache.axis2.databinding.ADBException: Unexpected subelement passager
    </faultstring>
    <detail/>
    </soapenv:Fault>
    </soapenv:Body>
    </soapenv:Envelope>
    Je pense que mon problème vient de l'écriture de ma requête (peut-être un problème avec les namespaces). Je ne suis pas un expert en web services et je suis bloqué sur ce problème.

    Pouvez-vous m'éclairer?

    Merci

  2. #2
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    La wsdl que tu nous montres, elle est complète ?
    je ne vois pas les définitions de namespace pour "tns" et "xsd"...
    A+

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Oui, j'ai copié/collé tout le fichier wsdl (généré à partir de Eclipse)...
    Mais mon document semble valide (je l'ai validé avec http://www.w3schools.com/XML/xml_validator.asp)

    Je dois modifié mon wsdl tout de même?

  4. #4
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    un document wsdl utilise des tags provenant de différentes spécifications.

    Pour que les tags ne se mélangent pas, on peut leurs attribuer un namespace (un peu comme on donnerait un package en java pour différentier deux classes qui auraient le même nom)

    ce namespace est généralement un URI.

    mais cela ne serait pas pratique de devoir à chaque fois le taper du genre :

    <http://oca.blala.bla:MonTag> valeur1 </http://oca.blala.bla:MonTag>

    on peut donc faire qqch du genre :

    xmlns:oca="http://oca.blala.bla"

    puis

    <oca:MonTag> valeur1 </oca:MonTag>

    Il y a encore plein du subtilités comme les namespace par défaut mais bref,
    ce que je veux juste dire, c'est que dans ton cas, tns et xsd ne sont défini nulle part...

    Dans ma wsdl, l'élément "definitions" ressemble plutôt à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    <wsdl:definitions 
    	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    	xmlns:ns1="http://schemas.xmlsoap.org/soap/http" 
    	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    	xmlns:tns="http://oca/" 
    	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    	name="IService" 
    	targetNamespace="http://oca/">
    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Merci beaucoup pour ton explication qui m'a éclairée!

    En fait tu avais raison, mon wsdl était incomplet (j'avais fait un copié/collé depuis le wsdl affichée avec firefox, mais lorsque j'ai affiché la source, celui-ci était différent).

    Voici mon vrai wsdl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions name="avionWS" targetNamespace="localhost" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="localhost" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
      <wsdl:types>
        <xsd:schema targetNamespace="localhost">
          <xsd:element name="Optimisation">
            <xsd:complexType>
              <xsd:sequence maxOccurs="1" minOccurs="1">
                <xsd:element name="passager" type="tns:Passager"/>
              </xsd:sequence>
            </xsd:complexType>
     
          </xsd:element>
          <xsd:element name="OptimisationResponse">
            <xsd:complexType>
              <xsd:sequence maxOccurs="1" minOccurs="1">
                <xsd:element name="passagerReponse" type="tns:Passager"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
     
          <xsd:complexType name="Passager">
     
          	<xsd:sequence>
          		<xsd:element name="id" type="xsd:string"/>
          		<xsd:element name="groupe" type="xsd:string"/>
          		<xsd:element name="siege" type="xsd:string"/>
          	</xsd:sequence>
          </xsd:complexType>
        </xsd:schema>
      </wsdl:types>
      <wsdl:message name="OptimisationRequest">
     
        <wsdl:part name="parameters" element="tns:Optimisation">
        </wsdl:part>
      </wsdl:message>
      <wsdl:message name="OptimisationResponse">
        <wsdl:part name="parameters" element="tns:OptimisationResponse">
        </wsdl:part>
      </wsdl:message>
      <wsdl:portType name="avionWS">
        <wsdl:operation name="Optimisation">
     
          <wsdl:input message="tns:OptimisationRequest">
        </wsdl:input>
          <wsdl:output message="tns:OptimisationResponse">
        </wsdl:output>
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="avionWSSOAP" type="tns:avionWS">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="Optimisation">
     
          <soap:operation soapAction="localhost/Optimisation"/>
          <wsdl:input>
            <soap:body use="literal"/>
          </wsdl:input>
          <wsdl:output>
            <soap:body use="literal"/>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
     
      <wsdl:service name="avionWS">
        <wsdl:port name="avionWSSOAP" binding="tns:avionWSSOAP">
          <soap:address location="http://127.0.0.1:8180/axis2/services/avionWS"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    J'ai modifié ma requête SOAP et cela semble fonctionner à présent, voici ma nouvelle requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
    <ns:Optimisation xmlns:ns="http://localhost">
    <passager><id>TOTO</id><groupe>TOTO</groupe><siege>TOTO</siege></passager>
    </ns:Optimisation>
    </soapenv:Body>
    </soapenv:Envelope>
    J'ai ajouté xmlns:ns="http://localhost" à mon objet Optimisation.

    Voila,

    Merci beaucoup pour tes réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment passer du XML dans une requête SOAP
    Par pdau2571 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 18/10/2010, 17h13
  2. XML Injection dans une requête SOAP
    Par rohrix dans le forum Services Web
    Réponses: 0
    Dernier message: 27/04/2009, 17h26
  3. Type incompatible dans une requête
    Par tleboukaka dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/10/2007, 12h59
  4. [ADO] Passage de paramètre de type Date dans une requête
    Par e-ric dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/01/2006, 13h36
  5. Calculs complexes dans une requête
    Par ARRG dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/06/2005, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo