Negli articoli precedenti abbiamo parlato dettagliatamente dei Web Beans spiegando come esistano delle specifiche a tal proposito. In questo articolo presentiamo gli Open Web Beans, ossia l‘implementazione Apache delle specifiche Sun JSR-299 del modello a componenti stateful e contestuale.
Che cosa è Open Web Beans?
Open Web Beans è l’implementazione Apache delle specifiche JSR-299 relative ai Web Beans. È rilasciata open source secondo la licenza ASL (Apache Software License) [1].
Come già spiegato nella serie di articoli sull’argomento [2], le specifiche Web Beans rappresentano un tentativo di definire un modello a componenti stateful e contestuale e la sua gestione nell’ambito di applicazioni enterprise basate su Java EE 5 e 6. Sappiamo già che prima di Web Beans non esisteva alcun approccio standardizzato relativamente all’integrazione tra il presentation layer e il transactional layer di una applicazione (si pensi per esempio ad applicazioni basate su JSF ed EJB Session Bean per capire le difficoltà a cui si andava incontro). Web Beans si occupa della gestione e del lifecycle dei componenti all’interno del container secondo un proprio standard e facendo ampio uso delle annotations, introdotte in Java a partire dalla versione 5.0, per facilitarne la configurazione. Abbiamo anche visto che Web Beans non è limitato al solo ambito degli EJB container, ma può anche essere usato esternamente, anche in un contesto Java SE.
Open Web Beans è responsabile della implementazione del runtime container conforme alle specifiche Web Beans. Oltre a tale implementazione, il core di Open Web Beans comprende anche alcuni componenti bult-in che semplificano la vita dello sviluppatore nell’ambito della complessa interazione con altre operazioni specifiche di Java EE (messaging, logging, security, etc.).
Moduli di Open Web Beans
Open Web Beans è costituito da un core piccolo e da un insieme di plugin. Il core comprende l’implementazione delle funzionalità di base delle specifiche che non contengono riferimenti ad altre tecnologie Java EE. Esso rappresenta l’implementazione del framework per la dependency injection. È valido sia per Java Web container semplici, come Tomcat o Jetty, che per container Java EE, quali ad esempio JBoss o Geronimo. Il codice del core può essere scaricato dal repository SVN [3].
I plugin disponibili sono:
- JPA plugin: usato per l’implementazione di tutto ciò che riguarda le Java Persistence API. Questo plugin inietta il persistent context e i persistent units di JPA usando le annotazioni @PersistentContext e @PersistentUnit. Il plugin fornisce, nell’ambito di utilizzo di EJB container full Java EE, il transactional entity manager. Il codice di tutto ciò che è prettamente legato al core JPA è scaricabile dal repository SVN [4]. Invece il core per l’injection del transactional entity manager è scaricabile dal repository SVN [5].
- JMS plugin: usato per l’implementazione delle funzionalità relative a JMS (Java Message Service). Questo modulo può essere scaricato dal repository SVN [6].
- JSF plugin: usato per l’implementazione delle funzionalità relative a JSF (Java Server Faces). Può essere scaricato dal repository SVN [7].
- EJB plugin: usato per l’implementazione delle funzionalità relative alle specifiche EJB (Enterprise Java Bean). Attualmente è ancora in fase di definizione e di sviluppo.
Configurazione
Open Web Beans, una volta scaricato, può essere utilizzato in una applicazione dopo averne correttamente impostato i valori delle proprietà dei suoi file di configurazione. Il principale fra questi file è openwebbeans.properties, che si trova nella directory META-INF/openwebbeans/. Inizialmente tutte le proprietà sono impostate con i valori di default. Tali proprietà sono:
- org.apache.webbeans.spi.JNDIService: usata per la configurazione dell’implementazione del servizio JNDI. Il valore di default è org.apache.webbeans.spi.se.JNDIServiceStaticImpl. L’implementazione di default può essere usata con Tomcat e Jetty. Altrimenti va impostata a org.apache.webbeans.spi.ee.JNDIServiceEnterpriseImpl per poter utilizzare implementazioni del JNDI service specifiche per container Java EE.
- org.apache.webbeans.spi.TransactionService: indica il transaction service da utilizzare. Il valore di default è org.apache.webbeans.spi.ee.TransactionServiceJndiImpl.
- org.apache.webbeans.spi.JPAService: indica il JPA service da utilizzare. Il valore di default è org.apache.webbeans.jpa.spi.se.JPAServicePersistenceImpl.
- org.apache.webbeans.spi.deployer.MetaDataDiscoveryService: indica il discovery service che esegue il find degli artefatti Web Beans. Il valore di default è org.apache.webbeans.spi.ee.deployer.WarMetaDataDiscoveryImpl.
- org.apache.webbeans.spi.conversation.ConversationService: indica quale JSF conversation service va utilizzato. Il valore di default è org.apache.webbeans.spi.conversation.jsf.JSFConversationServiceImpl.
Qualora, oltre al core, si vogliano utilizzare anche dei plugin, bisogna aggiungere i JAR di questi ultimi nel classpath dell’applicazione. I plug-in di Open Web Beans vengono riconosciuti tramite il java.util.ServiceLoader. Ciascun plugin contiene il proprio file META-INF/service/org.apache.webbeans.plugins.OpenWebBeansPlugin, all’interno del quale viene indicata la classe che implementa il plugin corrispondente. Allo startup dell’applicazione, l’implementazione di Open Web Beans esegue una ricerca dei propri plugin e registra tutti quelli trovati.
Tutti i plugins, nelle applicazioni Java web based che includono Open Web Beans, vengono configurati tramite il Servlet Context Listener. Il listener di Open Web Beans va dichiarato esplicitamente nel web deployment descriptor (web.xml) applicativo:
org.apache.webbeans.servlet.WebBeansConfigurationListener
Nel caso in cui si vogliano utilizzare funzionalità JSF, bisogna specificarlo nel seguente modo (sempre nel web.xml
file):
webbeans org.apache.webbeans.jsf.WebBeansJSFFilter webbeans Faces Servlet
Conclusioni
Open Web Beans è un progetto ancora in fase di evoluzione, ma rappresenta un valido riferimento per capire e poter utilizzare concretamente le specifiche Web Beans in una applicazione Java. Al fine di verificare tale validità, consiglio caldamente di dare anche uno sguardo approfondito ai numerosi esempi scaricabili dal repository SVN indicato al link [8] dei riferimenti.
Riferimenti
[1] Apache Software License
http://www.apache.org/licenses/
[2] Guglielmo Iozzia, “Web Beans. I parte: Introduzione e specifiche”, MokaByte 138, Marzo 2009 e successivi articoli della serie
https://www.mokabyte.it/cms/article.run?articleId=2U2-E3P-NNC-6VT_7f000001_10911033_0a4a63e2
[3] Open Web Beans core SVN repository URL
https://svn.apache.org/repos/asf/incubator/openwebbeans/trunk/webbeans-impl/
[4] JPA plugin core SVN repository URL
https://svn.apache.org/repos/asf/incubator/openwebbeans/trunk/webbeans-jpa
[5] Geronimo module SVN repository URL
https://svn.apache.org/repos/asf/incubator/openwebbeans/trunk/webbeans-geronimo
[6] JMS plugin module SVN repository URL
https://svn.apache.org/repos/asf/incubator/openwebbeans/trunk/webbeans-jms
[7] JSF plugin module SVN repository URL
https://svn.apache.org/repos/asf/incubator/openwebbeans/trunk/webbeans-jsf
[8] Open Web Beans examples SVN repository URL
https://svn.apache.org/repos/asf/incubator/openwebbeans/trunk/samples/