Creare un WebService con Spring WS

Analizziamo la realizzazione di un semplice WebService, sfruttando le API che ci vengono messe a disposizione da Spring WS.

Spring Web Services ci permette di realizzare dei WebService utilizzando la metodologia contract-first, ovvero partendo dalla definizione del WSDL per poi realizzare il servizio che si nasconde dietro. Non mi dilungo sulle motivazioni che hanno spinto i creatori di Spring Web Services a scegliere questa metodologia e vi rimando alla documentazione ufficiale dove viene spiegato nel dettaglio.

A differenza della metodologia contract-last, dove il WSDL viene generato automaticamente a partire dal servizio che sviluppiamo, in questo caso il punto centrale nella definizione del WebService è il WSDL che viene esposto. A partire da questo WSDL poi noi agganciamo la nostra implementazione.

 

Definizione del servizio

Ipotizziamo di dover realizzare un classico servizio per la conversione delle valute (mi sono impegnato ma alla fine non ho trovato di meglio 😛 ). Quello che viene inviato al servizio come richiesta è un valore da convertire e il tipo di conversione. Dovendo partire dalla definizione del contratto, realizziamo un XSD dove mappiamo queste informazioni

In questo XSD abbiamo definito che la request ha due elementi, il valore da convertire e la tipologia di conversione, definita all’interno dello schema come un simpleType.

 

Generazione del codice

Passiamo ora alla generazione delle classi Java che vengo descritte dal nostro servizio. Per fare questo possiamo utilizzare il plugin Maven per JAXB2, che a partire dal file XSD genera le classi con le relative annotation JAXB. Qui di seguito viene riportato il pom.xml del nostro progetto d’esempio

Sono state definite le dipendenze per Spring WS e nel build del nostro progetto abbiamo aggiunto un plugin che ci permette di generare le classi. Facendo un build del nostro progetto troveremo le classi generate da JAXB, come quella che gestisce la request che viene riportata qui di seguito

Nella definizione del nostro servizio abbiamo riportato anche un simpleType, ConversionType, che utilizza il namespace di JAXB per indicare la generazione di un Enum. Proprio per questo motivo tra le classi generate avremo l’Enum corrispondente

 

Configurazione del web.xml

Ora che abbiamo definito il servizio e generate le classi per gestire le richieste, possiamo passare a Spring WS. La prima cosa che dobbiamo inserire nella nostra applicazione è il caricamento del contesto Spring dal web.xml. Se avete avuto modo di lavorare con Spring MVC avrete già avuto modo di fare una cosa analoga, definendo la DispatcherServlet che è il Front Controller attraverso cui funziona l’MVC di Spring.

Spring WS funziona in maniera analoga e quindi dovremo definire la classe MessageDispatcherServlet come Front Controller della nostra applicazione

In questo modo tutte le chiamate che la nostra applicazione web riceverà sul path /conversione/ saranno gestite da Spring WS. Come potete vedere viene passato un parametro alla Servlet, contextConfigLocation,che è la definizione del contesto di Spring WS dove dovremo appunto andare a riportare la configurazione che vorremo utilizzare per il nostro servizio.

 

Contesto di Spring WS

Dobbiamo definire ora il nostro WebService, partendo dal presupposto che il punto di partenza deve essere il servizio che abbiamo definito nel file XSD. Nella parte iniziale del file di configurazione facciamo le classiche definizioni per i namespace di Spring

Oltre alla definizione dei namespace abbiamo riportato anche il tag context:component-scan, che si occuperà di ricercare i componenti definiti tramite Annotation.

La prima cosa che viene configurata sarà un’istanza di DefaultWsdl11Definition, che è una classe che si occupa di generare il WSDL del nostro servizio

Così facendo abbiamo definito le seguenti informazioni

  • schema: è un implementazione di org.springframework.xml.xsd.SimpleXsdSchema, che prende come input il file XSD definito in precedenza
  • portTypeName: il nome del nostro servizio
  • locationUri: dove sarà possibile contattare il nostro servizio
  • targetNamespace: il namespace utilizzato

 

Ora dobbiamo dire a Spring come deve effettuare il marshal delle classi utilizzate dal nostro servizio. In questo caso utilizziamo Jaxb2Marshaller, che si basa sulle annotation JAXB2 presenti nelle nostri classi.

Come ultima parte del contesto Spring, inseriamo nella configurazione un PayloadLoggingInterceptor,  Interceptor che ci permette di loggare le informazioni che transitano sul nostro servizio

Se avete già sviluppato dei WebService utilizzando JAX-WS, troverete delle analogie tra la definizione di questi Interceptor e gli Handler. In entrambi i casi abbiamo a che fare con una sorta di filtri che mettiamo nel processamento della richiesta.

 

Implementazione del servizio

Il servizio che dobbiamo implementare è abbastanza semplice e l’interfaccia può essere quella che viene riportata nel seguente codice

La classe che implementa questa interfaccia utilizzerà l’annotation Service di Spring per essere utilizzata direttamente nel nostro WebService

Questo è il classico servizio Spring, ora invece dobbiamo implementare l’Endpoint che verrà richiamata da Spring WS per gestire il WebService che abbiamo definito.

Con l’annotation @Endpoint comunichiamo a Spring WS che questa classe è l’endpoint per il nostro WebService. Poi con @PayloadRoot definiamo nello specifico la richiesta che viene gestita. Ora non ci resta che impacchettare il tutto e metterlo sul nostro server

 

Prova del servizio

Una volta effettuato il deploy del WAR, possiamo visualizzare il WSDL del servizio inserendo il seguente URL nel nostro browser: http://localhost:8080/SpringWS/conversione/ConversioneService.wsdl . Per fare un test al volo, senza dover creare un client, possiamo utilizzare un tool come soapUI dove andiamo a specificare l’URL del nostro WSDL

soapUI-setup

e in automatico abbiamo una richiesta di test da effettuare, dove dobbiamo semplicemente inserire i valori e vedere il risultato del nostro WebService

soapUI-test

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *