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 :

[xfire]Dynamic client et complex type


Sujet :

Services Web Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut [xfire]Dynamic client et complex type
    Bonjour, bonsoir

    Bon encore moi, et encore Xfire... Donc j'ai presque fini mon prototype client/serv (Java/Xfire) avec Xfire, nusoap et connexion ssl mais me reste un dernier tout petit probleme assez rageant.

    Donc mon client est dynamic, je n'utilise pas de WSDL2JAVA et donc tout se passe bien sauf qd je me met a utilise des type complex :
    - pour passer un objet en parametre a une fonction sur le server tout marche nickel
    - MAIS pour recuperer un objet en retour d'une fonction gros probleme>

    La logique voudrait que ca se passe pareil mais non.

    Donc en detail : cote serveur j'ai une fonction qui me renvoie un objet (plutot une struct mais bon) person :
    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
     
    $ns="https://adresse/exampleWSserverPHP/"; //namespace de mon WS
     
    //creation du serveur nusoap 
     $server = new soap_server();
     $server->configureWSDL('exampleWSserveur',$ns);
     $server->wsdl->schemaTargetNamespace=$ns;
     
    //declaration de mon type complex
     $server->wsdl->addComplexType(
        'Person',
        'complexType',
        'struct',
        'all',
        '',
        array(
            'firstname' => array('name' => 'firstname', 'type' => 'xsd:string'),
            'age' => array('name' => 'age', 'type' => 'xsd:int'),
            'gender' => array('name' => 'gender', 'type' => 'xsd:string')
        )
     );
     
    //declaration de ma fonction
     function HelloGetPerson() {
        return array(
                    'firstname' => "Nana",
                    'age' => 20,
        			'gender' => "Female"
                    );
     }
    //enregistrement de ma fonction
     $server->register('HelloGetPerson',        // method name
        array(),        						// input parameters
        array('person' => 'tns:Person'),    	// output parameters
        'uri:https://adresse/exampleWSserverPHP/',	                    // namespace
        'uri:https://adresse/exampleWSserverPHP/', 		    // SOAPAction
        'rpc',                                  // style
        'encoded'                              	// use
     );
    et cote java avec XFire j'ai cree la classe 'Person' correspondante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Person {
     
    	private String firstname;
    	private int age;
    	private String gender;
            public Person() {
    		super();
            }
            //plus les fonctions get et set pr chaque var
    }
    Et qd je cree mon client je recupere le complex type et je lui dit qu'il correspond a la classe Person
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //creation de mon client (avec HttpGet car derriere y a une adresse en HTTPS mais bon je passerai les details
    client = new Client(HttpGet.getResponseBodyAsStream(),String.class);	
     
    ////Get Complex Type
    Service model = client.getService();
    AegisBindingProvider bp = (AegisBindingProvider) model.getBindingProvider();
    TypeMapping typeMapping = bp.getTypeMapping(model);
    BeanType bt = new BeanType();
    bt.setSchemaType(new QName("https://adresse/exampleWSserverPHP/","Person"));
    bt.setTypeClass(Person.class);
    typeMapping.register(bt);
    Donc la si j'invoke une fonction qui prend en parametre un objet person et qui me retourne du string ou du int il n'y a aucune probleme mais si j'appel ma fonction HelloGetPerson presente en debut de post ben je me retrouve avec une belle erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    results = client.invoke("HelloGetPerson", new Object[] {});		
    System.out.println("HelloGetPerson(): "+ results[0]+"\n");
    Me donne l'erreur :
    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
     
    org.codehaus.xfire.fault.XFireFault: Fault: java.lang.NullPointerException
    	at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
    	at org.codehaus.xfire.client.Client.onReceive(Client.java:410)
    	at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
    	at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
    	at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
    	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
    	at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
    	at org.codehaus.xfire.client.Client.invoke(Client.java:336)
    	at org.codehaus.xfire.client.Client.invoke(Client.java:368)
    	at DynamicClient.main(DynamicClient.java:116)
    Caused by: java.lang.NullPointerException
    	at org.codehaus.xfire.aegis.AegisBindingProvider.getReadType(AegisBindingProvider.java:193)
    	at org.codehaus.xfire.aegis.type.basic.BeanType.readObject(BeanType.java:152)
    	at org.codehaus.xfire.aegis.type.basic.ObjectType.readObject(ObjectType.java:133)
    	at org.codehaus.xfire.aegis.AegisBindingProvider.readParameter(AegisBindingProvider.java:169)
    	at org.codehaus.xfire.service.binding.RPCBinding.readMessage(RPCBinding.java:91)
    	at org.codehaus.xfire.soap.handler.SoapBodyHandler.invoke(SoapBodyHandler.java:42)
    	at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    	at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
    	... 9 more
    Et impossible de trouver d'ou ca peut venir, je suis pas non plus expert ds les WS, tres loin de la et encore moins sur Xfire donc j'ai peut etre oubli8er kke chose de tres important mais je ne trouve pas.

    Par exemple c'est peut etre un probleme de namespace, j'ai appris que si le namespace de mon server ne correspondant pas au namespace de mon client XFire n'arrivais pas parser la reponse recu (meme si elle contenait les bonne info) :
    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
     
    //je recois la reponse XML :
    Apr 22, 2008 9:53:41 AM org.codehaus.xfire.util.LoggingHandler invoke
    INFO: <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://adresse/exampleWSserverPHP/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Body>
    <ns1:HelloGetPersonResponse xmlns:ns1="https://adresse/exampleWSserverPHP/">
    <person xsi:type="tns:Person">
    <firstname xsi:type="xsd:string">Nana</firstname>
    <age xsi:type="xsd:int">20</age>
    <gender xsi:type="xsd:string">Female</gender>
    </person>
    </ns1:HelloGetPersonResponse>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
     
    //et il m'affiche pourtant :
    HelloGetPerson(): [#document: null]
    Et si je met les meme namespace (comme precise ici : http://mule.mulesource.org/jira/browse/MULE-2044 a la derniere reponse) ben il m'affiche l'erreur precedente...


    Je sais que c'est qd meme un probleme assez precis mais bon j'y ai passer toute la journe vous etes mon dernier recours ^^
    si jamais vous avez la moindre piste ou alors un autre site ou je pourrai trouve la reponse a mon probleme je suis preneur


    Merci d'avance.

    ps: desole de pas mettre d'accent mais je suis sur un clavier qwerty

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Je cherche toujours.. personne n'a de piste ?

  3. #3
    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
    Hello,
    J'ai essayé, et je n'ai pas réussis a faire le binding non plus avec xfire
    le problème, c'est que xfire est passé à CXF qui lui-même implémente les api de JAX-WS, et du coup, on ne trouve plus beaucoup de documentation sur xfire...

    tu peux toujours essayer ça pour voir ce que tu reçois, peut-être que cela peut aider

    Object[] res = (Object[])client.invoke(...);

    DocumentImpl doc = (DocumentImpl) res[0];
    System.out.println(">>["+doc.saveXML(null)+"]");

    A+

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Alors deja merci bcp pour ta reponse (me sens moisn seul ^^)

    Donc en fait l'erreur apparait lors de l'appel de : client.invoke("HelloGetPerson", new Object[] {}); et donc je ne peux pas voir ce que je recois...

    J'ai un peu abandonnee la le tps de faire un autre truc qui n'a rien a voir mais je compte repasser sur cette foutu erreur a la noix au plus tot. Ca m'embeterais enormement de devoir tout refaire sous CXF (pkoi jai pas commencer pas la bougre d'imbecile que je suis)

  5. #5
    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
    voila encore quelques pistes :

    il y a plusieurs façons d'invoquer un web service

    il y a les façons "sans norme" ou chaque fournisseur y va de sa sauce.
    Il y a la norme JAX-RPC, qui elle même fournit trois façades :
    - Par stub (le stub est généré par un outil qui créer le stub depuis la wsdl)
    - Par proxy
    - Par Invocation dynamique (DII)

    Pour encore un peu compliquer les choses, La norme JAX-RPC est maintenant remplacée par la norme JAX-WS qui propose aussi plusieurs manière de faire
    un appel (stub, ou dispatcher...)

    la manière "la plus sûr", c'est le stub généré à mon avis, parce qu'il est généré depuis la wsdl. mais bien sûr, il ne convient pas dans tout les cas, spécialement si le web service est découvert au runtime...

    le proxy est pratique, mais il utilise la réflexion et on a des fois des surprises de namespace (par ex, pour une classe dans un package "oca" il pourrait créer un namespace "http://oca/" alors que j'aurais voulu "http://oca"...

    JAX-WS est une bonne solution car on peut faire le mapping par annotation,
    et du coup, on a moins de surprise...


    Apache CXF permet un peu tout... :

    Il permet de faire simple, en utilisant la réflexion java (attention aux surprises) :
    http://cwiki.apache.org/CXF20DOC/simple-frontend.html

    Mais il permet aussi de travailler selon la norme "JAX-WS", avec dispatch ou non :
    http://cwiki.apache.org/CXF20DOC/how...-a-client.html

    A+

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/11/2010, 22h56
  2. [SSIS] [2K8] XML complex type
    Par Ptit_Dje dans le forum SSIS
    Réponses: 3
    Dernier message: 03/09/2009, 19h33
  3. [XSd] Restriction du contenu d'une complex Type
    Par heavydrinker dans le forum Valider
    Réponses: 1
    Dernier message: 15/04/2008, 10h34
  4. Complex Type String
    Par magicbart dans le forum Services Web
    Réponses: 4
    Dernier message: 16/01/2008, 16h34
  5. [SOAP] [VBA] Comment contourner le probleme des "Complex types" ?
    Par jaudouy dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 06/09/2007, 12h00

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