SeamFramework.orgCommunity Documentation

Capitolo 40. Seam su Websphere AS di IBM

40.1. Informazioni sull'ambiente ed il deploy in Websphere AS
40.1.1. Versioni delle installazioni
40.2. L'esempio jee5/booking
40.2.1. Cambiamenti al file di configurazione
40.2.2. Build dell'esempio jee5/booking
40.2.3. Deploy dell'applicazione in Websphere
40.3. Esempio Prenotazione jpa
40.3.1. Build dell'esempio jpa
40.3.2. Deploy dell'esempio jpa
40.3.3. Cosa c'è di diverso in Websphere AS V7
40.4. Deploy dell'applicazione creata usando seam-gen su Websphere V7
40.4.1. Eseguire il setup in seam-gen
40.4.2. Cambiamenti richiesti per il deploy in Websphere

Websphere AS V7 è l'application server di IBM. Questa release è pienamente certificata Java EE 5.

Innanzitutto procediamo con alcune informazioni base sull'ambiente Websphere AS che useremo negli esempi. Andremo a fondo nei dettagli con l'esempio JEE5 Prenotazione. Procederemo anche nel deploy di un'applicazione d'esempio JPA.

Websphere AS è un prodotto commerciale e quindi non si discuteranno i dettagli della sua installazione, basta dire di seguire le istruzioni fornite dal particolare tipo di installazione e dalla licenza. Questa sezione dettaglierà le versioni del server, i suggerimenti sull'installazione ed alcune proprietà specifiche necessarie negli esempi.

Tutti gli esempi e le informazioni in questo capitolo sono basate sulla versione V7 di Websphere AS al momento della scrittura.

Dopo l'installazione di Websphere AS, creare il profile del server con il Profile Management Tool, qualora non si sia creato il profile in fase di installazione.

L'esempio jee5/booking è basato sull'esempio PrenotazioneHotel (che gira su JBoss AS). E' stato progettato per girare anche su Glassfish, ma con i passi descritti sotto può essere deployato in Websphere. E' collocato nella directory $SEAM_DIST/examples/jee5/booking.

Sotto sono riportate le modifiche al file di configurazione necessarie all'esempio base.

resources/WEB-INF/components.xml

Occorre cambiare il modo di ricerca EJB per WAS. Bisogna rimuovere /local dalla fine dell'attributo jndi-pattern. Dovrebbe apparire così:



<core:init jndi-pattern="java:comp/env/jboss-seam-jee5/#{ejbName}" debug="true"/>
                  
resources/META-INF/ejb-jar.xml

Sostituire la stringa /local da ejb-ref-name. Vedere il seguente codice finale:



   <enterprise-beans>
      <!-- EJB reference required when one Seam EJB component references another Seam EJB component using @In -->
      <!-- Not required if you inject using @EJB, but then you lose state management and client-side interceptors (e.g., security) -->
      <session>
         <ejb-name
>RegisterAction</ejb-name>
         <ejb-local-ref>
            <ejb-ref-name
>jboss-seam-jee5/AuthenticatorAction</ejb-ref-name>
            <ejb-ref-type
>Session</ejb-ref-type>
            <local
>org.jboss.seam.example.booking.Authenticator</local>
         </ejb-local-ref>
      </session>
   </enterprise-beans
>
resources/WEB-INF/web.xml

Occorre apportare alcumi cambiamenti ai riferimenti EJB in web.xml. Queste modifiche consentono a WAS di associare automaticamente i riferimenti EJB3 nel modulo web ai bean EJB3 nel modulo EAR. Sostituire tutte le stringhe /local in ejb-local-refs.



  <!-- JEE5 EJB3 names -->
  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/AuthenticatorAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.example.booking.Authenticator</local>
  </ejb-local-ref
>        

  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/BookingListAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.example.booking.BookingList</local>
  </ejb-local-ref>

  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/RegisterAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.example.booking.Register</local>
  </ejb-local-ref>

  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/ChangePasswordAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.example.booking.ChangePassword</local>
  </ejb-local-ref>

  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/HotelBookingAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.example.booking.HotelBooking</local>
  </ejb-local-ref>

  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/HotelSearchingAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.example.booking.HotelSearching</local>
  </ejb-local-ref>

  <ejb-local-ref>
    <ejb-ref-name
>jboss-seam-jee5/EjbSynchronizations</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
  </ejb-local-ref
>

Si noti che EjbSynchronizations è un EJB predefinito in Seam e non è parte dell'esempio Prenotazione Hotel. Questo significa che se components.xml specifica transaction:ejb-transaction, allora occorre includere:



  <ejb-local-ref>
    <ejb-ref-name
>myapp/EjbSynchronizations</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local-home
></local-home>
    <local
>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
  </ejb-local-ref
>

in web.xml. Se non viene incluso, si ottiene il seguente errore:

Name comp/env/myapp/EjbSynchronizations not found in context java:
resources/META-INF/persistence.xml

Per questo esempio useremo il datasource di default che è presente in WAS. Cambiare l'elemento jta-data-source:



<jta-data-source
>DefaultDatasource</jta-data-source>
                  

Poi occorre sistemare alcune proprietà Hibernate. Innanzitutto commentare le proprietà Glassfish. Poi occorre aggiungere/modificare le proprietà:



<!--<property name="hibernate.transaction.flush_before_completion" value="true"/>-->
<property name="hibernate.cache.provider_class" 
                  value="org.hibernate.cache.HashtableCacheProvider"/>
<property name="hibernate.dialect" value="GlassfishDerbyDialect"/>
<property name="hibernate.transaction.manager_lookup_class" 
          value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/>
                  

src/GlassfishDerbyDialect.java

Occorre prendere GlassfishDerbyDialect.java e copiarlo nella directory /src. La classe java è presente nella directory dei sorgenti dell'esempio JPA e può essere copiata usando il comando sottostante assumendo di essere nella directory jee5/booking:

cp ../../jpa/src/GlassfishDerbyDialect.java
   ./src

Questa classe verrà messa nel file jboss-seam-jee5.jar.

resources/import.sql

Questo file deve essere copiato dall'esempio JPA poiché sia Derby DB od il dialetto non supportano non supportano modifiche alla colonna ID. I file sono identici tranne per questa colonna. Usare il seguente comando per eseguire la copia:

cp ../../jpa/resources-websphere7/import.sql ./resources

Ora ogni cosa è al posto giusto. Ciò che manca è il deploy - qualche passo in più.

Per questo si userà la console di amministrazione di Websphere. Come prima ecco alcuni trucchi e suggerimenti da seguire.

I passi sottostanti riguardano la versione WAS dichiarata all'inizio. Le porte sono ai valori di default, se vengono cambiati occorre sostituire i valori.

  1. Fare il login nella console di amministrazione

    https://localhost:9043/admin

    oppure

    http://localhost:9060/admin

  2. Accedere all'opzione menu Websphere enterprise applications sotto il menu a sinistra Applications --> Application Type.

  3. In cima alla tabella Enterprise Applications selezionare Install. Sotto sono visualizzate le pagine del wizard con ciò che va fatto su ciascuna:

  4. Ora che si è installata l'applicazione occorre fare degli aggiustamenti ad essa prima di avviarla:

  5. Per avviare l'applicazione ritornare alla tabella Enterprise Applications e selezionare l'applicazione nella lista. Quindi scegliere il pulsante Start in cima alla tabella.

  6. Ora si può accedere all'applicazione all'indirizzo http://localhost:9080/seam-jee5-booking/index.html.

Fortunatamente far funzionare l'esempio jpa è molto più semplice che per l'esempio jee5. Questo è l'esempio Prenotazione Hotel implementato in Seam POJOs usando Hibernate JPA con le transazioni JPA. Non usa EJB3.

L'esempio ha già un pò di configurazioni e build script per molti comuni container incluso Websphere.

La prima cosa da fare è costruire e deployare quell'esempio. Poi verranno apportate delle modifiche chiave necessarie.

Questo è simile all'esempio jee5 all'indirizzo Sezione 40.2.3, «Deploy dell'applicazione in Websphere», ma senza molti passi.

  • Dalla tabella Enterprise Applications selezionare il pulsante Install.

    • Preparazione per l'installazione dell'applicazione

      • Navigare fino al file examples/jpa/dist-websphere7/jboss-seam-jpa.war usando il widget per l'upload dei file.

      • Selezionare il pulsante Fast Path.

      • Selezionare il pulsante Next.

    • Selezionare il pulsante Next per le prossime tre pagine, non servono modifiche.

    • Mappare context roots per i moduli Web

      • Nel text box Context root inserire jboss-seam-jpa.

      • Selezionare il pulsante Next.

    • Pagina Summario

      • Rivedere le impostazioni e selezionare il pulsante Finish per installre l'applicazione. Quando l'installazione è terminata selezionare il link Save e si ritornerà alla tabella Enterprise Applications.

  • Come per l'esempio jee5 ci sono alcuni cambiamenti necessari al class loader prima di avviare l'applicazione. Seguire le istruzioni in installation adjustments for jee5 example e cambiare jboss-seam-jpa_war per Seam Booking.

  • Infine avviare l'applicazione selezionandola nella tabella Enterprise Applications e cliccando il pulsante Start.

  • Si può ora accedere all'applicazione all'indirizzo http://localhost:9080/jboss-seam-jpa/index.html.

Le differenze tra gli esempi JPA che eseguono il deploy in JBoss 4.2 e Websphere AS V7 sono perlopiù attese; cambiamenti alle librerie ed al file di configurazione.

seam-gen è un tool molto utile per gli sviluppatori per ottenere velocemente applicazioni pronte per l'esecuzione e fornisce un fondamento per aggiungere proprie funzionalità. Di base seam-gen produrrà applicazioni configurate per girare su JBoss AS. Queste istruzioni mostreranno i passi necessari per farle funzionare su Websphere. Come dichiarato sopra in Sezione 40.2, «L'esempio jee5/booking » ci sono alcune modifiche sottili necessarie per avere un'applicazione EJB3 funzionante. Questa sezione mostrerà gli esatti passi da compiere.

Il primo passo è impostare seam-gen per costruire il progetto base. Ci sono parecchie scelte fatte sotto, in particolar modo il datasource ed i valori Hibernate che occorre aggiustare una volta che il progetto è creato.

./seam setup
Buildfile: build.xml

init:

setup:
     [echo] Welcome to seam-gen :-)
    [input] Enter your Java project workspace (the directory that contains your 
Seam projects) [C:/Projects] [C:/Projects]
/home/jbalunas/workspace
    [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.3.GA] 
[C:/Program Files/jboss-4.2.3.GA]
/home/jbalunas/jboss/jboss-4.2.3.GA
    [input] Enter the project name [myproject] [myproject]
websphere_example
     [echo] Accepted project name as: websphere_example
    [input] Do you want to use ICEFaces instead of RichFaces [n] (y, [n], )

    [input] skipping input as property icefaces.home.new has already been set.
    [input] Select a RichFaces skin [blueSky] ([blueSky], classic, ruby, wine, 
deepMarine, emeraldTown, sakura, DEFAULT)

    [input] Is this project deployed as an EAR (with EJB components) or a WAR 
(with no EJB support) [ear]  ([ear], war, )

    [input] Enter the Java package name for your session beans [org.jboss.seam.
tutorial.websphere.action] [org.jboss.seam.tutorial.websphere.action]
org.jboss.seam.tutorial.websphere.action 
    [input] Enter the Java package name for your entity beans [org.jboss.seam.
tutorial.websphere.model] [org.jboss.seam.tutorial.websphere.model]
org.jboss.seam.tutorial.websphere.model  
    [input] Enter the Java package name for your test cases [org.jboss.seam.
tutorial.websphere.action.test] [org.jboss.seam.tutorial.websphere.action.test]
org.jboss.seam.tutorial.websphere.test
    [input] What kind of database are you using? [hsql]  ([hsql], mysql, oracle,
 postgres, mssql, db2, sybase, enterprisedb, h2)

    [input] Enter the Hibernate dialect for your database [org.hibernate.
dialect.HSQLDialect] [org.hibernate.dialect.HSQLDialect]

    [input] Enter the filesystem path to the JDBC driver jar [/tmp/seam/lib/hsqldb.jar] 
[/tmp/seam/lib/hsqldb.jar]

    [input] Enter JDBC driver class for your database [org.hsqldb.jdbcDriver] 
[org.hsqldb.jdbcDriver]

    [input] Enter the JDBC URL for your database [jdbc:hsqldb:.] 
[jdbc:hsqldb:.]

    [input] Enter database username [sa] [sa]

    [input] Enter database password [] []

    [input] Enter the database schema name (it is OK to leave this blank) [] []

    [input] Enter the database catalog name (it is OK to leave this blank) [] []

    [input] Are you working with tables that already exist in the database? [n]
  (y, [n], )

    [input] Do you want to drop and recreate the database tables and data in 
import.sql each time you deploy? [n]  (y, [n], )

[propertyfile] Creating new property file: 
/rhdev/projects/jboss-seam/svn-seam_2_0/jboss-seam-2_0/seam-gen/build.properties
     [echo] Installing JDBC driver jar to JBoss server
     [copy] Copying 1 file to /home/jbalunas/jboss/jboss-4.2.3.GA/server/default/lib
     [echo] Type 'seam create-project' to create the new project

BUILD SUCCESSFUL
Total time: 3 minutes 5 seconds

Digitare ./seam new-project per creare il progetto e cd /home/jbalunas/workspace/websphere_example per la nuova struttura creata.

Ora serve apportare alcuni cambiamenti al progetto generato.

resources/META-INF/persistence-dev.xml
src/GlassfishDerbyDialect.java

Come per gli altri esempi occorre includere questa classe java per il supporto DB. Può essere copiata dall'esempio jpa nella directory websphere_example/src.

cp $SEAM/examples/jpa/src/GlassfishDerbyDialect.java
   ./src

resources/META-INF/jboss-app.xml

Si può cancellare questo file poiché non si eseguirà il deploy in JBoss AS (jboss-app.xml viene usato per abilitare l'isolamento del classloading in JBoss AS)

resources/*-ds.xml

Si possono cancellare questi file poiché non si eseguirà il deploy in JBoss AS (questi file definiscono i datasource in JBoss AS, si userà invece il datasource di default di Websphere)

resources/WEB-INF/components.xml
  • Abilitare l'integrazione delle transazioni gestite dal container - aggiungere il componente <transaction:ejb-transaction /> ed la sua dichiarazione di namespace xmlns:transaction="http://jboss.com/products/seam/transaction"

  • Modificare jndi-pattern in java:comp/env/websphere_example/#{ejbName}

  • Non serve managed-persistence-context per quest'esempio e quindi si può cancellare questa riga.

    
    
    <persistence:managed-persistence-context name="entityManager"
                 auto-create="true"
                 persistence-unit-jndi-name="java:/websphere_exampleEntityManagerFactory"/> 
resources/WEB-INF/web.xml

Come per l'esempio jee5/booking occorre aggiungere i riferimenti EJB a web.xml. Questi riferimenti richiedono di sostituire la stringa /local in ejb-ref-name e selezionarli affinché Websphere esegua il corretto binding.


  
  <ejb-local-ref>
    <ejb-ref-name
>websphere_example/AuthenticatorAction</ejb-ref-name>
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.tutorial.websphere.action.Authenticator</local>
  </ejb-local-ref
>        
   
  <ejb-local-ref>
    <ejb-ref-name
>websphere_example/EjbSynchronizations</ejb-ref-name
>  
    <ejb-ref-type
>Session</ejb-ref-type>
    <local
>org.jboss.seam.transaction.LocalEjbSynchronizations</local>
  </ejb-local-ref
>

Quest'applicazione ha requisiti simili come nell'esempio jee5/booking.