Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Web Services in Java con Axis 2

Panoramica su Axis2, evoluzione del precedente progetto Axis dell'Apache Software Foundation
Panoramica su Axis2, evoluzione del precedente progetto Axis dell'Apache Software Foundation
Link copiato negli appunti

Axis2 è un progetto, sviluppato dall'Apache Software Foundation, che fornisce uno strumento mediante il quale è possibile pubblicare o interrogare un webservice in pochi minuti. Axis2 non è soltanto una libreria, ma un vero e proprio tool di sviluppo, un evoluzione del precedente progetto Axis. In questo articolo faremo riferimento alla versione 1.3 scaricabile dal sito ufficiale.

Consigliamo di scaricare la distribuzione completa che include sia la web application necessaria per la pubblicazione dei nostri servizi, sia una serie di strumenti che permettono di generare automaticamente le classi java per richiamare un qualsiasi web service, a partire dal suo file WSDL (Web Services Description Language).

Per semplicità installiamo la web application sulla versione 5.5 di Tomcat copiando il file war nella directory webapps.

Per verificare che l'installazione sia andata a buon fine colleghiamoci alla pagina http://localhost:8080/axis2/ dove avremo a disposizione tre link:

  1. Services che permette di visualizzare tutti i servizi disponibili;
  2. Validate che permette di verificare se tutte le librerie richieste sono presenti;
  3. Administrator che permette di accedere alla console di amministrazione. Le credenziali di accesso sono admin-axis2. È possibile modificarle nel file WEB-INFconfaxis2.xml.

Come esempio creiamo un servizio che chiameremo Catalogo che simula la gestione di un classico negozio virtuale. Mettiamo a disposizione i seguenti metodi:

  • getProdotto che restituisce le informazioni su un prodotto;
  • getProdotti che restituisce l'elenco dei prodotti del nostro negozio virtuale.

Prepariamo la classe che gestisce il servizio:

Listato 1. Classe che gestisce il servizi

package org.sportfantasy.ws;

import org.sportfantasy.vo.ProdottoVO;

public class CatalogoWS {
  public ProdottoVO getProdotto(int idProdotto) {
    if (idProdotto == 1) {
      return new ProdottoVO(1, "Prodotto 1", 10);
    } else if (idProdotto == 2) {
      return new ProdottoVO(2, "Prodotto 2", 20);
    } else if (idProdotto == 3) {
      return new ProdottoVO(3, "Prodotto 3", 30);
    } else {
      return null;
    }
  }

  public ProdottoVO[] getProdotti() {
    ProdottoVO[] lista = new ProdottoVO[3];
    lista[0] = new ProdottoVO(1, "Prodotto 1", 10);
    lista[1] = new ProdottoVO(2, "Prodotto 2", 20);
    lista[2] = new ProdottoVO(3, "Prodotto 3", 30);
    return lista;
  }
}

Per pubblicare mediante Axis il servizio, bisogna creare un file di configurazione (services.xml) e posizionarlo nella directory META-INF.

Listato 2. File di configurazione

<service name="Catalogo">
  <description>Catalogo</description>
  <parameter name="ServiceClass" locked="false">org.sportfantasy.ws.CatalogoWS</parameter>
  <operation name="getProdotto">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  </operation>
  <operation name="getProdotti">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  </operation>
</service>

Nel file di configurazione elenchiamo le classi che contengono i metodi che vogliamo pubblicare. Nel nostro esempio l'unica classe è org.sportfantasy.ws.CatalogoWS. A ciascun metodo viene associata una classe che si occupa di gestire la risposta al client. Per semplicità abbiamo utilizzato la classe apache.axis2.rpc.receivers.RPCMessageReceiver di Axis ma è possibile scrivere anche una classe personalizzata.

A questo punto abbiamo una directory che contiene una cartella META-INF con il file services.xml e la classe compilata org.sportfantasy.ws.CatalogoWS. Copiamo tutto nella directory di axis WEB-INF/services.

Axis provvederà automaticamente alla pubblicazione del servizio. Collegandoci all'indirizzo http://localhost:8080/axis2, e cliccando sul link Services, è possibile verificare se il nostro servizio è stato pubblicato correttamente e, qualora la procedura sia andata a buon fine, visualizzare il file WSDL.

Come detto in precedenza, Axis2 mette a disposizione degli sviluppatori anche diversi tool. Uno dei più importanti e utili è il comando wsdl2java che permette di generare le classi java per richiamare un web service a partire da un file wsdl.

Per utilizzare il tool è necessario creare una variabile di ambiente AXIS2_HOME che punta alla directory di installazione di axis.

Consigliamo, inoltre, di aggiungere la directory AXIS2_HOME/bin alla variabile di ambiente Path. In questo modo abbiamo a disposizione i comandi axis da qualsiasi punto del file system.

Fatto ciò, apriamo una finestra DOS ed eseguiamo il seguente comando:

wsdl2java -uri http://localhost:8080/axis2/services/Catalogo?wsdl -p org.sportfantasy.ws.client

La sintassi del comando è la seguente:

wsdl2java [options] -uri <url or path>

Con l'opzione -p definiamo il package delle classi che verranno generate. Mediante questo comando axis genera 2 classi CatalogoStub.java e CatalogoCallbackHandler.java che utilizzeremo per richiamare il servizio.

Listato 3. Client che richiama il servizio

package org.sportfantasy.ws.client;

import java.rmi.RemoteException;

import org.sportfantasy.ws.client.CatalogoStub.GetProdottiResponse;
import org.sportfantasy.ws.client.CatalogoStub.GetProdotto;
import org.sportfantasy.ws.client.CatalogoStub.GetProdottoResponse;
import org.sportfantasy.ws.client.CatalogoStub.ProdottoVO;

public class CatalogoTest {

  public static void main(String[] s) throws java.lang.Exception {
    CatalogoTest.testGetProdotto();
    System.out.println("Prodotti disponibili");
    CatalogoTest.testGetProdotti();
  }

  public static void testGetProdotto() throws RemoteException {
    CatalogoStub stub = new CatalogoStub();

    GetProdotto params = new GetProdotto();
    params.setIdProdotto(1);

    GetProdottoResponse resp = stub.getProdotto(params);

    ProdottoVO prodotto = resp.get_return();

    System.out.print(prodotto.getIdProdotto() + " - ");
    System.out.print(prodotto.getNome() + " - ");
    System.out.println(prodotto.getPrezzo());
  }

  public static void testGetProdotti() throws RemoteException {
    CatalogoStub stub = new CatalogoStub();

    GetProdottiResponse resp = stub.getProdotti();

    ProdottoVO[] prodotti = resp.get_return();

    for (int i = 0; i < prodotti.length; i++) {
      System.out.print(prodotti[i].getIdProdotto() + " - ");
      System.out.print(prodotti[i].getNome() + " - ");
      System.out.println(prodotti[i].getPrezzo());
    }
  }
}

Come è possibile notare Axis ha generato la classe CatalogoStub che ha due metodi principali getProdotto e getProdotti che corrispondono ai metodi da noi precedentemente pubblicati. Naturalmente è necessario includere le librerie di axis all'interno del classpath.

Cosa importante è che axis vi permette di generare le classi di un client a partire dal file WSDL indipendentemente dal linguaggio nel quale il web service è stato sviluppato o dall'application server sul quale il servizio viene pubblicato.

Ti consigliamo anche