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

EJB references

Come referenziare in maniera non ambigua i servizi ed utilizzarli all'interno degli ejb
Come referenziare in maniera non ambigua i servizi ed utilizzarli all'interno degli ejb
Link copiato negli appunti

Una web application di un certo rilievo farà sicuramente uso delle risorse dell'application server, in particolar modo degli ejb, per sviluppare servizi più o meno complessi.

Il paradigma di sviluppo a componenti porta con sé la possibilità (e spesso la necessità) di mettere insieme più componenti, riutilizzarli in maniera sequenziale per formare le logiche di business requisito dell'applicazione.

Richiamare un bean, da un altro bean è un'operazione molto semplice. Si utilizza il contesto passato dall'ambiente di esecuzione (o se ne crea uno nuovo) e si effettuano le operazioni necessarie: tipico è l'esempio di un session bean che fa da wrapper per un entity bean.

Ipotizziamo la presenza di un bean carrello della spesa (stateful session bean) che, nel metodo di calcolo del totale, necessita del bean catalogo (entity bean) per recuperare i prezzi correnti.

..//
  Context ctx=new InitialContext();
  CatalogoHome ch= (CatalogoHome) PortableRemoteObject.narrow(
    ctx.lookup("java:comp/env/ejb/CatalogoHome"),CatalogoHome.class);
  Catalogo c=ch.create();
  //recupero i prezzi dall'entity bean e calcolo il totale
..//

Come vediamo, il riferimento al bean è definito dalla stringa java:comp/env/ejb/CatalogoHome, in cui dovrebbe essere presente l'entity bean. La convenzione delle directory JNDI è quella di definire i servizi in apposite directory (env/ejb per gli ejb, env/jdbc per le connessioni ai database), ma trattasi di convenzioni che alcuni application server potrebbero non rispettare. È evidente che in una situazione del genere la nostra applicazione andrebbe in errore.

Per questo motivo la piattaforma J2EE mette a disposizione degli ejb, i cosiddetti riferimenti. Un riferimento serve ad identificare, in fase di deploy, il servizio che verrà utilizzato all'interno del bean. In questo modo, anche se il nome del servizio non dovesse corrispondere, l'associazione sarà sempre garantita.

I riferimenti ejb (ejb references, in inglese) vengono inseriti tramite particolari tag all'interno del descrittore ejb-jar.xml.

..//
<session>
  <ejb-name>ShoppingCart</ejb-name>
  ..//
  <ejb-ref>
    <ejb-ref-name>ejb/CatalogoHome</ejb-ref-name>
    <ejb-ref-type>entity</ejb-ref-type>
    <home>examples.CatalogoHome</home>
    <remote>examples.Catalogo</remote>
    <ejb-link>CatalogoShopping</ejb-link>
  </ejb-ref>
..//
</session>
..//
<entity>
  <ejb-name>CatalogoShopping</ejb-name>
  <home>examples.CatalogoHome</home>
  ..//
</entity>
..//

All'interno del tag <ejb-ref> si inserisce il riferimento al bean da utilizzare, attraverso il tag ejb-link. Qui stiamo associando il riferimento CatalogoShopping (nel bean riferito da ejb/CatalogoHome) con l'entity bean il cui nome è CatalogoShopping. Il codice usato in precedenza, adesso è sicuramente portabile.

Aggiungiamo che la stessa cosa può essere fatta se si vuole utilizzare il riferimento locale, basta sostituire al tag ejb-ref, il tag ejb-local-ref.

Identica questione è legata a tutte le risorse dell'application server (datasource, transazioni, ecc). Quindi identica risoluzione dei riferimenti attraverso il tag resource-ref.

..//
<session>
  <ejb-name>ShoppingCart</ejb-name>
  ..//
  <resource-ref>
    <res-ref-name>jdbc/databaseDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>
  ..//
</session>
..//

In questo modo definiamo la sorgente dati databaseDS, che potrà essere riferita nel bean attraverso una lookup sulla directory dei datasource.

javax.sql.DataSource ds =(javax.sql.DataSource)context.lookup("java:comp/env/jdbc/databaseDS");

Ti consigliamo anche