Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 57 di 68
  • livello ninja
Indice lezioni

Realizzazione di un web service seconda parte

Seconda parte dello sviluppo di un web service su piattaforma J2EE
Seconda parte dello sviluppo di un web service su piattaforma J2EE
Link copiato negli appunti

Creeremo un EchoWebService, cioè un servizio che accetta come parametro di ingresso una stringa e lo restituisce al mittente a lettere maiuscole. La semplicità del servizio ci farà focalizzare l'attenzione sulle procedure necessarie allo sviluppo dello stesso.

Realizzeremo tutto su Application Server J2EE, per quegli aspetti tipici discussi nella precedente lezione. Un altro strumento necessario sarà il JWSDP di Sun, che utilizzeremo per la creazione del descrittore WSDL.

Come abbiamo già imparato, creiamo uno stateless session bean, partendo dalla definizione della sua interfaccia remota.

Listato 1. Creazione di un web service J2EE

public interface EchoWebService extends Remote {
  //Restituisce la stringa passata come riferimento
  public String echo(String sentence)throws RemoteException;
}

Visto che utilizzeremo questo bean solo come web service, possiamo omettere le classi Home, necessarie altrimenti a creare il componente distribuito. Passiamo dunque alla definizione del componente.

Listato 1. Classe concreta, contenente la logica applicativa

public class EchoWebServiceBean implements SessionBean {
  public void ejbCreate(){
    System.out.println("ECHO Service - create()");
  }
  
  public String echo(String s)throws RemoteException{
    System.out.println("ECHO Service - echo("+s+")");
    return "ECHO: "+s.toUpperCase();
  }
..//

Di fatto si tratta di uno stateless session bean, quindi dobbiamo seguire le sue regole di sviluppo (metodo ejbCreate, metodi activate, passivate, ...).

Passiamo al descrittore, che presenta delle novità, proprio per notificare all'application server del fatto che il bean sarà un web service.

..//
<display-name>Echo Web Service</display-name>
  <enterprise-beans>
    <session>
      <ejb-name>EchoWS</ejb-name>
      <service-endpoint>it.html.ejb.session.stateless.ws.EchoWebService</service-endpoint>
      <ejb-class>it.html.ejb.session.stateless.ws.EchoWebServiceBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
  </enterprise-beans>
..//

Come vediamo manca il riferimento alle interfacce Home, ed è presente il tag service-endpoint, in cui viene definita l'interfaccia da esporre (che deve essere Remote).

Il passo successivo è quello di creare il descrittore WSDL, in modo che in fase di deploy, venga messo su il middleware necessario ad accettare le richieste dei client. Potremmo fare tutto quanto a mano, ma il descrittore WSDL è un documento piuttosto complesso. Pertanto utilizzeremo il JWSDP, a cui daremo in pasto un documento più semplice (sempre xml) più la classe: questo elaborerà i dati e restituirà il documento WSDL.

Il descrittore che citavamo è il file config.xml che illustriamo di seguito.

<?xml version="1.0" encoding="UTF-8"?>

<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
  <service name="EchoWS"
    targetNamespace="http://ws.stateless.session.ejb.html.it/"
    typeNamespace="http://ws.stateless.session.ejb.html.it/types"
    packageName="it.html.ejb.session.stateless.ws">
      <interface name="it.html.ejb.session.stateless.ws.EchoWebService"/>
  </service>
</configuration>

Si presenta in maniera molto semplice: nome del servizio, namespace (per definirlo in maniera univoca), package ed interfaccia da utilizzare.

Spostiamoci ora su una finestra di comando, a livello della directory di compilazione (in maniera da semplificare il recupero della classe compilata). E lì inseriamo il file config.xml. Procediamo alla compilazione JAX RPC (./wsdp/jaxrpc/bin) nel modo seguente.

wscompile -classpath . -gen:server -f:rpcliteral -mapping mapping.xml config.xml

Se tutto è in ordine verranno fuori due file: il suddetto file WSDL (link a EchoWS.wsdl) ed il file mapping.xml (link a mapping.xml), che servirà al container per associare il servizio correttamente.

Ultimo descrittore da creare sarà il webservices.xml in cui associamo le definizioni dei file (wsdl e mapping) al giusto componente.

<webservices xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://www.ibm.com/webservices/xsd/j2ee_web_services_1_1.xsd" version="1.1">
  <webservice-description>
    <webservice-description-name>EchoWS</webservice-description-name>
    
    <wsdl-file>META-INF/wsdl/EchoWS.wsdl</wsdl-file>
    <jaxrpc-mapping-file>META-INF/mapping.xml</jaxrpc-mapping-file>
    
    <port-component>
      <port-component-name>EchoWebService</port-component-name>
      <wsdl-port>EchoWebServicePort</wsdl-port>
      <service-endpoint-interface>it.html.ejb.session.stateless.ws.EchoWebService</service-endpoint-interface>
      <service-impl-bean>
        <ejb-link>EchoWS</ejb-link>
      </service-impl-bean>
    </port-component>
  </webservice-description>
</webservices>

A questo punto mettiamo i file ejb-jar.xml, mapping.xml e webservices.xml sotto la directory META-INF ed il file wsdl sotto META-INF/wsdl.

Figura 1. Struttura del package
Struttura del package

Creiamo un package jar ed installiamo sull'application server.

Ti consigliamo anche