Java17EE: generare il codice di un WebService Proxy a partire da un WSDL

Generare il codice necessario ad interrogare un servizio web di tipo WSDL con Java in meno di 3 minuti è possibile, in questo articolo ti spiego passo dopo passo cosa fare…

Leggi tutto: Java17EE: generare il codice di un WebService Proxy a partire da un WSDL

Nel corso di una recente consulenza per un cliente mi sono trovato a dover generare del codice di comunicazione verso alcuni servizi web basati su XML Soap.

Il codice per scrivere un proxy per i WebService di tipo XML Soap è generalmente articolato, non impossibile da scrivere a mano, ma richiederebbe molto tempo ed è facile incappare in errori di definizione di tipi e parametri.

Solitamente i proxy di comunicazione verso un WebService Soap vengono generati a partire dal plugin wsimport il quale richiede delle dipendenze da specificare nel pom.xml del progetto.

Gli step da seguire per svolgere questo compito sono semplici (quando si conoscono) e possono essere sintetizzati in:

  • Recupero del WSDL di riferimento
  • Aggiunta del plugin wsimport al progetto
  • Soddisfazione delle dipendenze
  • Generazione del codice

Recupero del WSDL di riferimento

Recuperare il WSDL di riferimento è solitamente l’operazione più semplice, si accede da un qualsiasi browser all’indirizzo pubblico del WebService XML Soap e si aggiunge in querystring la chiave wsdl.

Per esempio, se il servizio web è esposto su https://xmlsoap.example.com/my-service/ per ottenere il WSDL di riferimento è sufficiente richiamare l’url https://xmlsoap.example.com/my-service/?wsdl

Salvare il file XML ottenuto in una cartella di progetto, solitamente per mia organizzazione lo faccio nella directory resources/wsdl del progetto. Facciamo finta che il nome attribuito al file sarà MyService.wsdl.

Aggiunta del plugin wsimport al progetto

  1. Aggiungere il plugin jaxws-maven-plugin al progetto,
  2. Prevedere un obiettivo di esecuzione con agomento wsimport
  3. Impostare la configurazione secondo la configurazione del proprio progetto.

Ma andiamo per gradi…

Nella sezione plugins del file pom.xml è necessario aggiungere il plugin:

<plugin>    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>4.0.2</version></plugin>

La versione indicata non è detto che funzioni in ogni progetto a prescindere, talvolta è necessario selezionare una versione precedente per renderlo compatibile con il proprio progetto, in virtù della versione di Java e dell’Application Server.

In questo plugin bisognerà specificare un execution plan aggiungendo nel tag plugin un blocco executions con una singola esecuzione il cui obiettivo è lanciare wsimport.

<plugin>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>4.0.2</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Infine bisognerà fornire alcuni parametri di configurazione per chiarire:

  1. dove risiede il file XML relativo al WSDL precedentemente recuperato.
  2. Il file (o i file se si tratta di generazione di più servizi proxy)
  3. il namespace da utilizzare per il codice generato
  4. Directory di destinazione del codice generato

Il codice che segue riporta le 4 informazioni minime essenziali

<plugin>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>4.0.2</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
        </execution>
    </executions>
    <configuration>

        <!-- Il namespace da utilizzare --> 
        <packageName>
            org.example.soap.ws.client
        </packageName>

        <!-- Dove risiede il file XML del WSDL -->
        <wsdlDirectory>
          ${project.basedir}/src/main/resources/wsdl/
        </wsdlDirectory>

        <!-- Elenco dei file wsdl -->
        <wsdlFiles>
            <wsdlFile>MyService.wsdl</wsdlFile>
        </wsdlFiles>

        <!-- Directory di generazione del codice -->
        <sourceDestDir>
            ${project.build.directory}/generated/
        </sourceDestDir>

    </configuration>
</plugin>

Soddisfazione delle dipendenze

Sempre nel file pom.xml è necessario specificare alcune dipendenze che permetteranno al plugin appena aggiunto di funzionare.

Solitamente mi faccio aiutare dal sito https://mvnrepository.com/ per recuperare i riferimenti corretti.

Per non dilungarmi, wsimport richiede le seguenti dipendenze:

  • JAX WS RI Runtime (jaxws Rt)
  • JAX WS RI Standalone Zipped Bundle
  • Jakarta XML Binding API

Da cui è possibile quindi ricavare questo elenco di dipendenze da inserire nel file pom.xml

Generazione del codice

La parte più semplice è a questo punto la generazione del codice, poichè sarà sufficiente eseguire dalla CLI l’istruzione:

mvn clean install -DskipTests

A questo punto, se le configurazioni sono corrette e le dipendenze tutte soddisfatte, il codice richiesto sarà disponibile nella directory specificata.

Non resta quindi che invocare il WebService!

Conclusioni…

Mi rendo conto di aver dato per scontato molte cose, mi immagino che chi legga questo articolo o lo sta facendo per punirsi di una cattiva azione compiuta o perchè ha conoscenze abbastanza profonde di Java ed ha bisogno di risolvere un problema (la generazione di codice automatizzato) nell’immediato.

Se invece sei semplicemente curioso e ti domandi il tipo folle che cura questo blog dove lavora, puoi trovarmi in Axio Studio, azienda si pone come obiettivo il supporto alle aziende dei più disparati settori per l’abbattimento dei costi attraverso l’ottimizzazione, la digitalizzazione dei processi e la transizione ecologica.


Commenti

Una risposta a “Java17EE: generare il codice di un WebService Proxy a partire da un WSDL”

  1. […] un mio precedente articolo ho spiegato come generare del codice per l’invocazione di un WebService XMLSoap attraverso il WSDL di riferimento, usando Java17. Continuerò quindi con questa versione. Tuttavia la versione di Java […]