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