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 :
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
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 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 public class Person { private String firstname; private int age; private String gender; public Person() { super(); } //plus les fonctions get et set pr chaque var }
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
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);
Me donne l'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");
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.
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
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) :
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...
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]
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
Partager