jan 03 2011

[Post-it] Convertir un WSDL (RPC-Encoding) en fichier Java

Catégorie(s): DéveloppementSébastien @ 21:14

Pour interroger un webservice SOAP, il m’a été nécessaire de générer tout un ensemble de classes à l’aide d’un fichier WSDL (RPC). J’ai tout d’abord tenté d’utiliser Axis2 et sa classe WSDL2Java mais j’ai été confronté à plusieurs erreurs du type :

org.apache.axis2.schema.SchemaCompilationException:
can not find type {http://schemas.xmlsoap.org/soap/encoding/}
Array from the parent schema urn:Interface

La raison est simple : Axis2 n’accepte pas les WSDL encodés suivant le type RPC. RPC est en effet une vieille spécification de SOAP 1.1 qui rencontre de gros soucis de performances dès que la charge augmente (cf. Discover SOAP encoding’s impact on Web service performance).

Dans mon cas, je n’ai pas le choix et je dois obligatoirement d’utiliser ce fichier pour interroger un webservice tiers. Il m’a donc fallu utiliser Axis 1.4 et au final ça c’est avéré hyper simple vu que ça se résume à une ligne de commande :

java -classpath "lib\*" org.apache.axis.wsdl.WSDL2Java -av -p [PAKAGE NAME] [WSDL FILE] -D

Donc on commence par passer le dossier « lib » comme classpath. On appelle ensuite la classe WSDL2Java avec les arguments suivants :

  • -a = générer le code pour tous les éléments ;
  • -v = Afficher ce que WSDL2Java génère lorsqu’elle le fait ;
  • -p = Nom du package dans lequel seront contenu les classes générées ;
  • -D = Afficher les informations de débogage.

Le dernier n’est pas obligatoire mais j’en ai eu besoin parce que le fichier WSDL fournit n’était pas valide (2 erreurs que j’ai dû corriger manuellement).

Et voilà vos classes Java générées. C’était pas si compliqué que ça quand on oublie pas de faire attention à l’encodage du fichier WSDL. Seul bémol : le code généré n’est pas ce qu’il y a de plus propre et vous risquez de devoir mettre le nez dedans pour corriger certains trucs.

Sources et infos complémentaires :