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 :

Invoquer un service web (input param : complexType)


Sujet :

Services Web Java

  1. #1
    Membre habitué
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut Invoquer un service web (input param : complexType)
    Bonjour,

    j'ai developé un service web en jax-ws sous Axis2 et ça marche très bien avec les type simple.. mais quand j'essaye de lui envoyer un type complexe il me renvoie une erreur.
    j'ai testé avec SOAPUI mais ca marche tjrs pas !!

    voici le soapMessage envoyé par le service quand je l'invoque avec un type complexe :

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
    <soapenv:Fault>
    <faultcode>soapenv:Server</faultcode>
    <faultstring>ws.example.Client</faultstring>
    <detail/>
    </soapenv:Fault>
    </soapenv:Body>
    </soapenv:Envelope>

    merci de bien vouloir m'aider, ce probleme m'a pris bcp de temps et je l'ai pas encore reglé

  2. #2
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Peux-tu mettre les logs et le code source ?

  3. #3
    Membre habitué
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    voici mon code
    j'ai un type complexe 'Bank' et contient un autre type complexe 'client'
    mais dans cette methode, j'utilise seulement le type Client.
    Class Bank:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public  class Bank {
    	protected String bankN ;
    	protected HashSet clientSet ;
    	protected double Rate ;
    ...}
    Class Client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Client{
    	public String address; 
    	public int amount;
    	public String phone;
    	public String clientN;
    ...}
    Mon Service Web :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @WebService
    @SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
    public class WSBank {
    ...
    @WebMethod public String clientName(Client client){
    				return client.getClientN();
    ...
    }
    ...}
    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
     
    <wsdl:types>
    <xs:schema xmlns:ax24="http://example.ws/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://example.ws">
    <xs:import namespace="http://example.ws/xsd"/>
    <xs:element name="clientName">
    <xs:complexType>
    <xs:sequence>
    <xs:element minOccurs="0" name="client" nillable="true" type="ax24:Client"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    <xs:element name="clientNameResponse">
    <xs:complexType>
    <xs:sequence>
    <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:schema>
    <xs:schema xmlns:ax26="http://util.java/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://example.ws/xsd">
    <xs:import namespace="http://util.java/xsd"/>
    <xs:complexType name="Client">
    <xs:sequence>
    <xs:element minOccurs="0" name="address" nillable="true" type="xs:string"/>
    <xs:element minOccurs="0" name="amount" type="xs:int"/>
    <xs:element minOccurs="0" name="clientN" nillable="true" type="xs:string"/>
    <xs:element minOccurs="0" name="phone" nillable="true" type="xs:string"/>
    </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Bank">
    <xs:sequence>
    <xs:element minOccurs="0" name="bankN" nillable="true" type="xs:string"/>
    <xs:element minOccurs="0" name="clientSet" nillable="true" type="ax26:HashSet"/>
    <xs:element minOccurs="0" name="Rate" type="xs:double"/>
    </xs:sequence>
    </xs:complexType>
    </xs:schema>
    </wsdl:types>
    <wsdl:message name="clientNameRequest">
    <wsdl:part name="parameters" element="ns:clientName"/>
    </wsdl:message>
    <wsdl:message name="clientNameResponse">
    <wsdl:part name="parameters" element="ns:clientNameResponse"/>
    </wsdl:message>
    <wsdl:portType>
    <wsdl:operation name="clientName">
    <wsdl:input message="ns:clientNameRequest"   wsaw:Action="urn:clientName"/>
    <wsdl:output message="ns:clientNameResponse" wsaw:Action="urn:clientNameResponse"/>
    </wsdl:operation>
    </wsdl:portType>
    j'utilise SOAPUI pour tester si ça fonctionne ou pas
    SOAPRequest:
    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
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:exam="http://example.ws" xmlns:xsd="http://example.ws/xsd">
       <soapenv:Header/>
       <soapenv:Body>
          <exam:clientName>
             <!--Optional:-->
             <exam:client>
                <!--Optional:-->
                <xsd:address>see</xsd:address>
                <!--Optional:-->
                <xsd:amount>239</xsd:amount>
                <!--Optional:-->
                <xsd:clientN>DSS</xsd:clientN>
                <!--Optional:-->
                <xsd:phone>999</xsd:phone>
             </exam:client>
          </exam:clientName>
       </soapenv:Body>
    </soapenv:Envelope>
    et le SOAPResponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
       <soapenv:Body>
          <soapenv:Fault>
             <faultcode>soapenv:Server</faultcode>
             <faultstring>ws.example.Client</faultstring>
             <detail/>
          </soapenv:Fault>
       </soapenv:Body>
    </soapenv:Envelope>

  4. #4
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    C'est pas évident de voir le problème avec les balises qui polluent la lecture et l'erreur qui n'avance pas grandement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     <faultcode>soapenv:Server</faultcode>
     <faultstring>ws.example.Client</faultstring>
    La seul chose que ça indique c'est que l'erreur vient de la "classe" Client.

    La première chose à laquelle j'ai pensé en voyant ton code pour la première fois c'est que tu utilise un HashSet. De mémoire je sais que les WS gèrent très mal tout ce qui est Hashxxx .]
    Essai un tableau, en dure s'il le faut, juste pour tester.

    L'idéal serai d'avoir des logs plus complète. Pour ça, utilise éclipse.
    Essai déjà de faire ce que je t'ai dis. Si ça ne marche pas et que tu sais pas le faire avec éclipse, je t'aiderai.

  5. #5
    Membre habitué
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    merci pour votre réponse.
    j'ai remplacé le HashSet par ArrayList dans ma classe Bank
    j'ai crée une requête SOAP qui contient le type complexe et par la suite j'ai invoqué le service Web sous eclipse voila l'erreur qui s'affiche:
    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
    javax.xml.ws.soap.SOAPFaultException: ws.example.Client
    	at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(Unknown Source)
    	at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(Unknown Source)
    	at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.doInvoke(Unknown Source)
    	at com.sun.xml.internal.ws.client.dispatch.DispatchImpl.invoke(Unknown Source)
    	at ws.complexTypeExample.CTDispatchDynamicInvocationTest.invoke(CTDispatchDynamicInvocationTest.java:56)
    	at ws.example.DynamicWSClient.invokeService(DynamicWSClient.java:393)
    	at ws.example.DynamicWSClient.invokeService(DynamicWSClient.java:386)
    	at ws.complexTypeExample.DynamicWSComplexTypeClientTest.testInvokeService(DynamicWSComplexTypeClientTest.java:97)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	at java.lang.reflect.Method.invoke(Unknown Source)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:276)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:48)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:244)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:59)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:242)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:49)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:235)
    	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:305)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    cause: null
    fault: [SOAP-ENV:Fault: null]
    msg: ws.example.Client

  6. #6
    Membre habitué
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    et voila les deux classes que j'ai créé pour invoquer le WS
    Class pour invoquer le SW:
    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
    package ws.complexTypeExample;
    
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    
    import javax.xml.namespace.QName;
    import javax.xml.soap.SOAPBody;
    import javax.xml.soap.SOAPElement;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.ws.Dispatch;
    import javax.xml.ws.Service;
    public class CTDispatchDynamicInvocationTest {
    	
    LinkedHashMap<String,String> invokationResponseValues = new LinkedHashMap<String,String>();
    
    public  SOAPMessage invoke ( LinkedHashMap<String,String> paramNames) throws IOException {
    		try{
    			URL wsdlLocation = new URL(wsdluri);
    			QName dispatchServiceQName = new QName(targetNSpace, serviceName);
    			QName dispatchPortName = 
    					new QName(targetNSpace,endPoint);
    			Service service = Service.create(wsdlLocation, dispatchServiceQName);
    			Dispatch<SOAPMessage> dispatch = service.createDispatch(dispatchPortName, SOAPMessage.class,
    			        Service.Mode.MESSAGE);
    			CreatComplexTypeRequestTest messageRequest = new CreatComplexTypeRequestTest();
    			SOAPMessage request = messageRequest.creatSoapRequestMessage(targetNSpace, operationName, paramNames);
    			request.writeTo(System.out);
    			    responseMessage = dispatch.invoke(request);
                       return responseMessage;
    	}
    }
    Class pour créer le SOAP message:
    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
    package ws.complexTypeExample;
     
    import java.io.IOException;
    import java.util.LinkedHashMap;
     
    import javax.xml.soap.MessageFactory;
    import javax.xml.soap.Name;
    import javax.xml.soap.SOAPBody;
    import javax.xml.soap.SOAPBodyElement;
    import javax.xml.soap.SOAPElement;
    import javax.xml.soap.SOAPEnvelope;
    import javax.xml.soap.SOAPException;
    import javax.xml.soap.SOAPFactory;
    import javax.xml.soap.SOAPMessage;
    import javax.xml.soap.SOAPPart;
    import javax.xml.ws.soap.SOAPFaultException;
     
    import org.w3c.dom.NodeList;
     
    public class CreatComplexTypeRequestTest {
     
    	public static SOAPBodyElement payload;
    	private static Name BankName;
    	private static SOAPBody body ;
     
    	public  SOAPMessage creatSoapRequestMessage (String targetNSpace, String operationName, LinkedHashMap<String,String> paramNamesToTypes) throws SOAPFaultException, SOAPException, IOException {
    	    SOAPMessage request = MessageFactory.newInstance().createMessage();
    		SOAPPart part = request.getSOAPPart();
    		SOAPEnvelope env = part.getEnvelope();
    		env.addNamespaceDeclaration("exam", targetNSpace);
    		env.addNamespaceDeclaration("xsd", "http://example.ws/xsd");
    		body = env.getBody();
    		SOAPFactory soapfactory =  SOAPFactory.newInstance();
    		BankName = soapfactory.createName(operationName, "exam", targetNSpace);
    	    payload = body.addBodyElement( BankName);
    	    SOAPElement client = payload.addChildElement("client","xsd");
    	    SOAPElement add = client.addChildElement("address", "xsd");
    	    add.addTextNode("addes");
    	    SOAPElement am = client.addChildElement("amount", "xsd");
    	    am.addTextNode("2999");
    	    SOAPElement ln = client.addChildElement("clientN", "xsd");
    	    ln.addTextNode("NN");
    	    SOAPElement ph = client.addChildElement("phone", "xsd");
    	    ph.addTextNode("1267");
    		 request.saveChanges();
    	  request.writeTo(System.out);	
     
    	  return request;
     
    }

  7. #7
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Essai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public  class Bank {
    	protected String bankN ;
    	protected Client client ;
    	protected double Rate ;
    ...}
    
    
    public class Client{
    	public String address; 
    	public int amount;
    	public String phone;
    	public String clientN;
    ...}
    En attendant je continu à chercher.

  8. #8
    Membre habitué
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    Hi rockley,
    j'ai fais les modifications que vous m'avez proposé mais ça marche toujours pas ...
    j'ai effectué plusieurs recherches avant de poster ma question et j'ai trouvé des problèmes similaires :
    http://www.developpez.net/forums/d57...s-complextype/
    http://www.developpez.net/forums/d11...type-complexe/
    D'après ces postes j'ai compris que la solution est de "Sérialiser" mon type complexe 'Client' avec JAXB par l'une des deux méthodes:
    • annoter ma classe 'Client' en utilisant le package le package javax.xml.bind.annotation.
    • configurer mon JAX-WS pour qu'il utilise un binding spécifique

    mais je ne sais pas si c'est bien la solution pour mon problème ou pas !!
    veuillez m'aider svp ...il me reste pas bcp de temps pour rendre mon projet
    je vous remercie pour votre aide

  9. #9
    Membre éclairé Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Par défaut
    Dans eclipse test ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public  class Bank implements Serializable{
    	protected String bankN ;
    	protected Client client ;
    	protected double Rate ;
    ...}
    
    
    public class Client implements Serializable{ 
    	public String address; 
    	public int amount;
    	public String phone;
    	public String clientN;
    ...}
    Et j'ai trouvé ça aussi, tutoriel jmd chap jaxb dans les cours et tutoriels pour apprendre java : http://java.developpez.com/cours/

  10. #10
    Membre habitué
    Femme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2008
    Messages : 9
    Par défaut
    ça a marché

    voici les modification que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @XmlRootElement
    public class Client { 
    	private Strig address; 
    	private int amount;
    	private String phone;
    	private String clientN;
    ...}
    j'ai fait un test avec le tuto que vous m'avez donné pour générer le fichier XML d'après ma classe et j'avais une erreur qui s'affiche par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    Class has two properties of the same name "phone"
    	this problem is related to the following location:
    		at public java.lang.String ws.example.Client.getPhone()
    		at ws.example.Client
    	this problem is related to the following location:
    		at public java.lang.String ws.example.Client.phone
    		at ws.example.Client
    donc la solution était de rendre les attributs 'private' .
    maintenant je peux envoyer un type complexe et obtenir le résultat
    merci infiniment rockley

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

Discussions similaires

  1. Invoquer un service web dans un processus BPEL
    Par fatmafifi dans le forum Services Web
    Réponses: 12
    Dernier message: 09/02/2011, 13h29
  2. invoquer un service web distant
    Par tntneo dans le forum Services Web
    Réponses: 1
    Dernier message: 18/03/2010, 13h27
  3. invoquer un service web
    Par AMINIS dans le forum Services Web
    Réponses: 3
    Dernier message: 18/03/2009, 14h23
  4. Comment invoquer un service web à partir d'une servlet
    Par ramanov dans le forum Services Web
    Réponses: 1
    Dernier message: 02/06/2008, 00h21
  5. Comment invoquer un service web
    Par ramanov dans le forum Services Web
    Réponses: 2
    Dernier message: 29/05/2008, 11h01

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