Consommer un webservice en Java

Consommer un webservice en Java - Java - Programmation

Marsh Posté le 03-11-2010 à 11:01:01    

Hello,
 
Voilà, j'ai une appli qui tourne déjà en Java, que je reprends, et je débute. Bon, faire des évolutions dans l'existant (sous Eclipse), ça va encore. Par contre, là, je dois consommer un webservice (j'ai donc un wsdl à une URL) et je galère...
Je me tape depuis 2 jours des docs sur Metro, Jax-WS, Axis, CXF, etc... Mais j'hallucine, j'entrave que dalle. J'ai juste besoin de consommer ce webservice, et j'ai des packages selon que ce soit Metro ou Axis qui sont énormes.
 
De quoi ai-je besoin à minima pour consommer ce webservice ? Je me vois mal déployer 5+ Mo de packages pour 5 méthodes appelées...

Reply

Marsh Posté le 03-11-2010 à 11:01:01   

Reply

Marsh Posté le 03-11-2010 à 17:12:40    

Toujours dans la recherche, j'en conclus surtout que pour l'instant c'est un peu la jungle. Déjà que j'étais pas très chaud pour cette techno (Java), c'est, dans cette aventure d'un client webservice, un pas de plus dans mes convictions. Bref.
 
J'ai donc creusé un peu plus, et essayé plusieurs "outils" comme wsimport ou wsdl2java qu'on trouve dans les distribs de Jax-WS ou encore Axis2.
 
Pour wsimport, deux choses :
- suivant que j'utilise celui de Metro ou celui d'Axis, je n'ai pas les mêmes erreurs ou messages d'info (mais bon, c'est tellement "carré" Java...).
- à priori, le webservice que j'attaque a des noms redondants, genre TrucBidule et TrucBIDULE, hors sous windows, impossible de générer quoique ce soit avec des noms similaires. Il existe bien à priori une option -B-XautoChaisPlusQuoi, mais elle ne fait rien (super !).
 
J'ai donc tenté le wsdl2java d'Axis2. Je télécharge le zip, j'unzip, en ligne de commande je fais mon wsd2java... Ok il me génère deux fichiers Java, dont un Stub de plus d'un Mo. Soit... Je les inclus dans mon projet sous Eclipse, et forcément j'ai plein d'erreurs. En cherchant avec jarfinder.com les références aux jar qu'il me manque, je fini par ne plus avoir d'erreurs, par contre le Stub java est imbitable, c'est juste goret de générer un truc pareil; alors je pourrais m'en contenter, mais je pense à ceux qui passeront derrière moi : donc c'est niet.
 
Là, en tripatouillant un peu (oui, je débute et sur Java et sur Eclipse), je m'aperçois que via un File > New > Other > Web Service Client, je peux générer quelque chose. Je tente donc l'affaire mais sans plus de résultats, j'ai une belle erreur du genre

Code :
  1. IWAB0399E Error in generating Java from WSDL:  java.io.IOException: <input ..>, <output ..> or <fault ..> in <portType> with undefined message found. message name is '{http://mon_url}UneEntree'
  2.     java.io.IOException: <input ..>, <output ..> or <fault ..> in <portType> with undefined message found. message name is '{http://mon_url/}UneEntree'
  3.     at org.apache.axis.wsdl.symbolTable.SymbolTable.ensureOperationMessageValid(SymbolTable.java:504)
  4.     at org.apache.axis.wsdl.symbolTable.SymbolTable.ensureOperationValid(SymbolTable.java:520)
  5.     at org.apache.axis.wsdl.symbolTable.SymbolTable.ensureOperationsOfPortTypeValid(SymbolTable.java:610)
  6.     at org.apache.axis.wsdl.symbolTable.SymbolTable.populatePortTypes(SymbolTable.java:630)
  7.     at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:783)
  8.     at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:583)
  9.     at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:538)
  10.     at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:595)
  11.     at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:367)
  12.     at java.lang.Thread.run(Unknown Source)


D'enfer !
Bref, toujours pas de solution. Je n'abandonne pas.
Merci si certains ont quelque info que ce soit.

Message cité 1 fois
Message édité par stoicism le 03-11-2010 à 17:13:48
Reply

Marsh Posté le 03-11-2010 à 20:12:19    

Je ne suis pas un grand fan des générateurs de code, mais le code généré n'est pas fait pour être lu. Il est fait pour être généré et exécuté. Autrement dit, les gens qui passeront derrière toi iront modifier le WSDL et regénéreront s'il le faut, et en aucuns cas n'iront modifier le code généré.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 04-11-2010 à 09:21:34    

Après essai via l'outil de génération d'Eclipse, mais cette fois sur un autre webservice, dont le wsdl semble plus "carré", ça marche. Et mieux, le code généré est "lisible".
Bon, reste à voir avec ceux qui fournissent l'autre, celui qui m'intéresse...

Reply

Marsh Posté le 05-11-2010 à 17:19:14    

stoicism a écrit :

Déjà que j'étais pas très chaud pour cette techno (Java), c'est, dans cette aventure d'un client webservice, un pas de plus dans mes convictions.


[:delarue5]
 

stoicism a écrit :

suivant que j'utilise celui de Metro ou celui d'Axis, je n'ai pas les mêmes erreurs ou messages d'info (mais bon, c'est tellement "carré" Java...).


Tu confonds un peu tout. Ce sont les webservices qui peut-être puent encore en 2010, comme si on n'avait rien appris depuis 2000. Tu trouveras les mêmes divergences avec des librairies en dehors de Java (.NET, ...). Les webservices sont supposés être indépendants du langage justement, mais chacun y va avec son idée d'implémentation pas forcément compatible avec les autres. Ce n'est pas la faute du langage sous-jacent.
 
Je n'ai utilisé que IntelliJ pour les webservices, pas Eclipse, et je dois dire que ça fonctionne out-of-ze-boite, comme une lettre à la poste pour consommer du WS sur base d'un WSDL.
 
Je te dirais de te méfier de JAX-WS si tu dois commencer à créer un WS et que tu comptes le customiser : autant j'ai été surpris par la facilité à mettre en oeuvre un WS, autant sa customization s'est révélée affreusement piégeuse. Mais ici, tu ne fais que consommer.
 

stoicism a écrit :

Je les inclus dans mon projet sous Eclipse, et forcément j'ai plein d'erreurs. En cherchant avec jarfinder.com les références aux jar qu'il me manque, je fini par ne plus avoir d'erreurs, par contre le Stub java est imbitable, c'est juste goret de générer un truc pareil; alors je pourrais m'en contenter, mais je pense à ceux qui passeront derrière moi : donc c'est niet


"forcément j'ai plein d'erreurs" -> attitude hautement négative :)
 
Et ne t'inquiète pas pour le code auto-généré. Tout le monde s'en fiche. Le but est de gagner en productivité, de générer et de ne plus le regarder. Le suivant utilisera son IDE / GUI pour générer un autre stub en cas de mise à jour et tout se passera pour le mieux. Franchement, se farcir ce genre de code à la main, c'était parfois une fatalité il y a dix ans mais en 2010, je perdrais pas mon temps.
 
Fais peut-être voir le WSDL. Il a peut-être une sale gueule de FUBAR ce qui pourrait expliquer en partie le peu d'entrain de ton IDE pour pauvres qui ne veulent pas mettre 200 misérables euros pour se payer IntelliJ.
 

Spoiler :

Fraïdaÿ troll  [:cmshadow]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 05-11-2010 à 18:53:06    


Ouais ok, j'avoue j'suis de mauvaise fois quand ça m'agace  [:stoicism]  

sircam a écrit :


Tu confonds un peu tout. Ce sont les webservices qui peut-être puent encore en 2010, comme si on n'avait rien appris depuis 2000. Tu trouveras les mêmes divergences avec des librairies en dehors de Java (.NET, ...). Les webservices sont supposés être indépendants du langage justement, mais chacun y va avec son idée d'implémentation pas forcément compatible avec les autres. Ce n'est pas la faute du langage sous-jacent.
 
Je n'ai utilisé que IntelliJ pour les webservices, pas Eclipse, et je dois dire que ça fonctionne out-of-ze-boite, comme une lettre à la poste pour consommer du WS sur base d'un WSDL.
 
Je te dirais de te méfier de JAX-WS si tu dois commencer à créer un WS et que tu comptes le customiser : autant j'ai été surpris par la facilité à mettre en oeuvre un WS, autant sa customization s'est révélée affreusement piégeuse. Mais ici, tu ne fais que consommer.
 


Passé mon énervement, avec un webservice de la boite qui semble être correct, avec l'outil de génération d'un client sous Eclipse (en fait c'est Axis derrière si j'en crois les jar qui s'ajoutent au projet), ça fonctionne et ça génère des trucs lisibles. Pour celui que je dois vraiment attaquer, je ne l'ai plus sous la main (il est par terre quoi...) et donc j'ai tenté de le faire en "local" mais Eclipse (3.3.3) plante. Ok j'essaierais donc de voir pourquoi le plugin (WTP?) déconne et le monter de version, ou alors carrément upgrade le client Eclipse. Mais j'ai peur des noms des éléments, cf une remarque dans un de mes posts au dessus concernant trucBidule et trucBIDULE où un wsimport ralait.

sircam a écrit :


"forcément j'ai plein d'erreurs" -> attitude hautement négative :)
 
Et ne t'inquiète pas pour le code auto-généré. Tout le monde s'en fiche. Le but est de gagner en productivité, de générer et de ne plus le regarder. Le suivant utilisera son IDE / GUI pour générer un autre stub en cas de mise à jour et tout se passera pour le mieux. Franchement, se farcir ce genre de code à la main, c'était parfois une fatalité il y a dix ans mais en 2010, je perdrais pas mon temps.
 
Fais peut-être voir le WSDL. Il a peut-être une sale gueule de FUBAR ce qui pourrait expliquer en partie le peu d'entrain de ton IDE pour pauvres qui ne veulent pas mettre 200 misérables euros pour se payer IntelliJ.
 

Spoiler :

Fraïdaÿ troll  [:cmshadow]



Je sens qu'effectivement le WSDL va être moche, même si je débute, je sens le truc foirax. Mais c'est pas grave, quitte à le modifier moi meme en local et déjà pouvoir bidouiller...
Après on verra...

Reply

Marsh Posté le 06-11-2010 à 15:28:51    

Bonjour,
 
J'ai pour ma part utilisé le plugin maven de generation de code  
http://cxf.apache.org/docs/maven-c [...] -java.html, qui marche très bien.
J'ai eu également un conflit sur la casse d'un des elements générés , mais  pour cà  il y a possibilité de compléter le wsdl par des extensions xml , je crois que ca s'appele  "WSDL Binding" et permet ainsi de renommer un des elements lors de la generation par exemple . Je posterai le detail de ce binding si je le retrouve.
J'avoue que j'ai un peu galéré également pour trouver une solution simple, et pourtant j'ai une longue expérience en java.

Reply

Marsh Posté le 08-11-2010 à 14:07:01    

Oui voilà, j'avais également aperçu la possibilité de faire du binding, mais j'avoue que déjà pour le xml simple, j'en suis au stade "décorticage d'infos".
D'ailleurs pour illustrer le problème, voilà ce que j'ai dans ce fichier (wsdl2java ou la génération au travers d'Eclipse - qui s'avérerait être aussi wsdl2java par Axis ?), en gras ce qu'il me ressort comme chaîne posant un problème, je pense particulièrement à ce qui est en gras rouge, vu que l'erreur est à priori qu'il ne peut pas créer 2 fichiers du même nom, ne gérant pas la casse... :

Code :
  1. <xs:complexType name="retourF1">
  2.   <xs:sequence>
  3.    <xs:element minOccurs="0" name="chaine1" type="xs:string" />
  4.    <xs:element minOccurs="0" name="testMAX" type="tns:testMAX" />
  5.    <xs:element minOccurs="0" name="testMIN" type="tns:testMin" />
  6.   </xs:sequence>
  7.   </xs:complexType>
  8.  
  9.   <xs:complexType name="testMin">
  10.   <xs:sequence>
  11.    <xs:element minOccurs="0" name="chaine2" type="tns:schaine2" />
  12.    <xs:element minOccurs="0" name="chaine3" type="tns:schaine3" />
  13.    <xs:element minOccurs="0" name="testMin" type="tns:testMIN" />
  14.   </xs:sequence>
  15.   </xs:complexType>
  16.  
  17.   <xs:simpleType name="testMIN">
  18.   <xs:restriction base="xs:string">
  19.    <xs:enumeration value="ERREUR" />
  20.   </xs:restriction>
  21.   </xs:simpleType>


Ce qui m'amène à une question : n'y a-t-il pas de conventions de nommage ? Je cherche en ce moment sur w3schools, mais pas d'info pour l'instant.

Reply

Marsh Posté le 08-11-2010 à 15:47:36    

sircam a écrit :


Tu confonds un peu tout. Ce sont les webservices qui peut-être puent encore en 2010, comme si on n'avait rien appris depuis 2000.


Juste pour ma culture gé, pourquoi tu dis que ça pue en 2010 ?

Reply

Marsh Posté le 10-11-2010 à 09:28:45    

A défaut d'avoir trouvé quelque chose sur le binding qui va dans le sens de ma demande, j'ai simplement renommé testMIN en testMIN_ dans le WSDL, généré au travers d'Eclipse, puis re-changé la chaîne à l'inverse dans les méthodes qui font appel à cet élément du WSDL.

Reply

Marsh Posté le 10-11-2010 à 09:28:45   

Reply

Marsh Posté le 11-11-2010 à 20:15:31    

stoicism a écrit :


Juste pour ma culture gé, pourquoi tu dis que ça pue en 2010 ?


Parce que je trouve les webservices encore peu commodes à utiliser aujourd'hui.
 
Il y a dix ans, bon, on y allait sans être hyper productif, les outils n'étaient pas intégrés, pas matures, c'était parfois fragile, et on faisait avec. Là j'ai l'impression qu'on s'emmerde un peu avec les mêmes âneries et j'attends mieux que ça à l'heure actuelle. C'est moins pire, il y a pas mal de choses qui fonctionnent d'un click dans l'IDE mais dès qu'on sort un peu de l'exemple simple, ça devient vite pénible et on retombe dans les même travers qu'avant.
 
Mais c'est juste mon impression. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed