JAX-WS

JAX-WS, ovvero Java API per XML Web Service. E' la tecnologia Java EE per la creazione di servizi web e clienti che comunicano tra loro usando XML.

Normalmente JAX-WS si appoggia su SOAP, ovvero si usa il protocollo stabilito da SOAP per la definizione dei dettagli, le chiamate e le risposte sono trasmesse come messaggi SOAP (e quindi file XML) su HTTP.

La complessità dei messaggi SOAP é nascosta allo sviluppatore, sia sul lato server che sul client. Non é necessario generare o fare il parsing dei messaggi SOAP, ci pensa il runtime di JAX-WS a convertire chiamate e risposte in e da messaggi SOAP.

E' possibile lavorare in ambienti misti, ovvero scrivere solo il client o il server usando JAX-WS, dato che si usano tecnologie definite dal W3C: HTTP, SOAP, e WSDL.

Un semplice servizio web

Io sto lavorando con Netbeans (la versione 6.7), che facilita notevolmente le operazioni al contorno. Mi vado a vedere qui il loro tutorial sull'argomento e lo seguo con minime variazioni.

Per prima cosa dobbiamo scegliere che tipo di container vogliamo per il nostro web service. Possiamo infatti usare un web container, e quindi usare Apache Tomcat, o un EJB container, e quindi utilizzare un Application Server che supporti gli EJB, come GlassFish.

Decidiamo per Tomcat (versione 6). Dunque creamo un nuovo progetto di tipo "Java Web", "Web Application". Chiamiamo la nostra applicazione JaxWSTest, confermiamo che il nostro server sarà Tomcat e lasciamo che Netbeans generi la struttura della applicazione.

Faccio un click di destra su JaxWSTest, specifico che voglio creare un "New Web Service", che chiamo "TestAdder" e che voglio vada nel package "jaxTest".

NetBeans ha reagito alle mie istruzioni creando il codice di base per un web service (lo vedo sotto "Source Packages") e creando una rappresentazione del web service sotto la cartelletta "Web Services".

Al momento il codice generato é questo:

package jaxTest;

import javax.jws.WebService;

@WebService()
public class TestAdder {
}

Che non é ancora un vero web service, dato che un web service deve avere almeno una operazione.

Allora aggiungiamo una operazione: riceviamo in input due interi, ne torniamo la somma.

Invece di scriverla a mano ci appoggiamo al wizard di Netbeans, dalla finestra che ci mostra il codice sorgente clicchiamo su "Design" e quindi "Add Operation ...".

Chiamamo la nostra operazione "add", specifichiamo che torna un "int", e che riceve in input due "int": i,j.

Ci resta da scrivere il corpo della nostra operazione, torniamo perciò alla vista "Source" per il file e aggiungiamo il codice "return i+j;" che porta a questo risultato finale per la nostra classe:

package jaxTest;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService()
public class TestAdder {
@WebMethod(operationName = "add")
public int add(@WebParam(name = "i") int i, @WebParam(name = "j") int j) {
return i+j;
}
}

Facciamo un click di destra sul nostro web project JaxWSTest, scegliamo "deploy" e lasciamo che netbeans si prenda carico dei dettagli. Ora Tomcat dovrebbe essere su e avere in carico il nostro web service.

Possiamo controllare che il nostro web service funzioni correttamente facendo un click di destra su "Test Web Service" per il nostro web service TestAdder nella cartelletta "Web Service". Quello che fa questo comando é andare ad aprire la pagina web:

http://localhost:8084/JaxWSTest/TestAdder

Se tutto é a posto dovremmo vedere una tabella con le informazioni per il nostro web service.

Un cliente per il servizio web

Creare una applicazione Java che faccia da client per un servizio web é di una facilità esemplare. Si crea una applicazione Java standard (io l'ho chiamata JaxWSClient), al suo interno scegliamo di creare un "Web Service Client", ci viene richiesto il WSDL da usare, noi diciamo di andarlo a cercare nel progetto del nostro servizio web, confermiamo e pensa netbeans a fare la parte noiosa del lavoro.

Andiamo a sbirciare nei "Generated Sources (jax-ws)" e vediamo che c'é tutto quello che ci serve per scrivere il nostro client.

Creiamo un file per il nostro client, se nel metodo main pigiamo la combinazione di tasti "Alt"+"insert" in una riga vuota, otteniamo un pop-up nel quale specifichiamo che vogliamo "Call Web Service Operation...", scendiamo nella gerarchia fino a trovare la nostra operazione "add", la selezioniamo, confermiamo e otteniamo la base per il nostro codice.

Nel nostro caso otterremo qualcosa del genere:

try { // Call Web Service Operation
jaxtest.TestAdderService service = new jaxtest.TestAdderService();
jaxtest.TestAdder port = service.getTestAdderPort();
// TODO initialize WS operation arguments here
int i = 0;
int j = 0;
// TODO process result here
int result = port.add(i, j);
System.out.println("Result = "+result);
} catch (Exception ex) {
// TODO handle custom exceptions here
}


Facciamo un minimo di modifiche e il nostro codice é pronto per essere testato:

package jaxwsclient;

import jaxtest.TestAdder;
import jaxtest.TestAdderService;

public class Main {
public static void main(String[] args) {

try { // Call Web Service Operation
TestAdderService service = new TestAdderService();
TestAdder port = service.getTestAdderPort();

int i = 12;
int j = 33;

int result = port.add(i, j);
System.out.println("Result = " + result);
}
catch (Exception ex) {
System.out.println("Something bad happened: " + ex.getMessage());
}
}
}

E' inoltre veramente facile passare da un container ad un altro. In pratica basta cambiare il riferimento al server nelle proprietà del progetto del web service, sezione run, fare un deploy verso il nuovo container, eliminare il vecchio wsdl e file generati dal client e reimportare il nuovo wsdl per passare alla nuova situazione.

Nessun commento:

Posta un commento