[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:
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:
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:
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:
1 2 3
|
results = client.invoke("HelloGetPerson", new Object[] {});
System.out.println("HelloGetPerson(): "+ results[0]+"\n"); |
Me donne l'erreur :
Code:
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:
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