Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 48
  1. #1

    Come importare le interfacce EJB3

    Ciao a tutti, Ho creato un progetto con maven che contiene 2 moduli 1 WAR(MyWeb) e un EJB(MyEjbs).
    Il modulo WAR fa da client dell'EJB che restituisce semplicemente del testo.

    Il problema è che se inserisco la dipendenza dell'EJB nel pom del WAR, (questo per poter usare l'interfaccia creata nell'EJB nel WAR), l'EJB viene pubblicato 2 volte.

    Come posso importare le sole interfacce dell'EJB nel WAR?
    Credo ci sia un modo più semplice rispetto a creare le interfacce dell'EJB in un JAR separato anche perche ho visto che la versione EJB3.1 non usa interfacce.

    GitHub: https://github.com/AndreaCatania/EjbTest

  2. #2
    Ciao Cata, per prima cosa controlla di avere inserito nel pom del progetto ejb il seguente plugin:
    codice:
    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ejb-plugin</artifactId>
            <version>2.5</version>
            <configuration>
              <!-- this is false by default -->
              <generateClient>true</generateClient>
            </configuration>
          </plugin>
    Poi nel pom del progetto web ti basta specificare nella dipendenza dell'ejb <type>ejb-client</type> esempio:
    codice:
    <dependency>
           <groupId>com.example</groupId>
           <artifactId>ejb-project</artifactId>
           <version>1.0-SNAPSHOT</version>
           <type>ejb-client</type>      
    </dependency>

  3. #3
    Ciao e grazie per la risposta, nel frattempo ho fatto pure questo test e come puoi vedere dai POM:

    MyEjbs: https://github.com/AndreaCatania/Ejb...MyEjbs/pom.xml
    MyWeb: https://github.com/AndreaCatania/Ejb.../MyWeb/pom.xml
    MyWeb2: https://github.com/AndreaCatania/Ejb...MyWeb2/pom.xml

    Tutto è impostato come dici tu però in fase di pubblicazione nel server, JBOSS mi dice che vengono istanziate 3 EJB ho la conferma di questo perche ho aggiunto 1 classe con variabile pubblica e statica al EJB (che dovrebbe essere condivisa tra i moduli MyWeb e MyWeb2).

    Tramite la servlet contenuta nel modulo "MyWeb2"(https://github.com/AndreaCatania/Ejb...vlet/Test.java) modifico il testo di questa variabile statica e mi aspetto che la servlet del modulo "MyWeb" legga il nuovo testo impostato (https://github.com/AndreaCatania/Ejb...vlet/Test.java) e questo non accade. Se ci fossero solamente le interfacce, come mi aspetto, dovrei poter accedere alla stessa variabile e cosi non è.

    Ci sono vicino ma manca ancora qualcosa...

  4. #4
    Vicino.....
    1) Allora tutta la configurazione maven dei progetti è sballata, non so come fai a deployare quei progetti dato (tranne se non singolarmente) dato che ti manca in modulo ear....
    2) Non capisco questa affermazione "Se ci fossero solamente le interfacce, come mi aspetto, dovrei poter accedere alla stessa variabile e cosi non è.", cosa c'entra una variabile statica è una variabile statica non dipende né da una interfaccia né da un oggetto è statica....

    Venendo alla configurazioni sbagliate :
    codice:
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ejb-plugin</artifactId>
        <version>2.3</version>
    	<configuration>
    			<!--ejbVersion>3.1</ejbVersion-->
    		<generateClient>true</generateClient>
    	</configuration>
    </plugin>
    Quel ejbVersion ti seve se vuoi veramente usare la specifica 3.1 altrimenti se provi a buildare (con maven) ti da errore perchè non trova il file di configurazione dell'ejb (ejb 2.1....).

    Il plugin maven-ear-plugin posizionato su pom con package type "POM" non produce nessun risultato....
    Per creare l'ear :
    Crei un nuovo modulo con package type ear e ovviamente in questo includi i tre progetti come dipendenze
    codice:
     <dependencies>
      	<dependency>
      		<groupId>com.andreacatania.test</groupId>
      		<artifactId>MyEjbs</artifactId>
      		<version>1.0-SNAPSHOT</version>
      		<type>ejb</type>
      	</dependency>
      	<dependency>
      		<groupId>com.andreacatania.test</groupId>
      		<artifactId>MyWeb</artifactId>
      		<version>1.0-SNAPSHOT</version>
      		<type>war</type>
      	</dependency>
      	<dependency>
      		<groupId>com.andreacatania.test</groupId>
      		<artifactId>MyWeb2</artifactId>
      		<version>1.0-SNAPSHOT</version>
      		<type>war</type>
      	</dependency>
    Fatto ciò allora vedrai che le cose funzionano.

    Non so cosa stai progettando di fare, ma tieni conto che l'uso proprietà statiche sugli ejb (per comunicare con i client) è fortemente sconsigliato.

    Ciauz...

  5. #5
    Il deploy lo faccio singolarmente, ho provato come dici tu e funziona anche facendo il deploy del solo ear.

    Tuttavia il problema rimane... premetto che non c'è un vero progetto ed ho usato quella variabile perche forse immagino gli EJB in un altro modo rispetto a come sono realmente...

    Usiamo per semplicità come progetto la gestione di una libreria dove è possibile leggere, aggiungere, rimuovere libri.
    Ho 3 moduli (separati) che girano sullo stesso server.

    Modulo (EJB) "core" che oltre a fornire i servizi soprascritti tramite EJB, conserva le info sui libri su una variabile statica di tipo "Map". (Sicuramente errato per un progetto di entità maggiore ma per fini di studio penso sia accettabile).
    Modulo (WAR) "frontend" che da la sola possibilità di mostrare i libri all'utente.
    Modulo (WAR) "backend" che fornisce all'utente (admin) la possibilita di modificare i libri etc...

    L'utente tramite una specifica servlet che risiede nel frontend, richiede i dati di un libro, la servlet tramite EJB preleva i dati e li restituisce.

    Quando un Admin modifica quel libro anche se lo fa utilizzando il modulo "backend" mi aspetto che acceda al context core che ho istanziato io quindi quando l'utente richiederà nuovamente i dati di quel libro li riceverà modificati come l'Admin li ha impostati.

    La struttura che immagino è: ejb-aie.jpg


    Invece a me sembra che sia in questo modo: ejb-anie.jpg

    Sambra come se ogni modulo istanzia l'EJB nel proprio context e non condivide i dati... a questo punto mi chiedo se è questo il giusto funzionamento cosa servono questi blasonati EJB se non collegano i vari context tra di loro?

    Sicuramente sono un po confuso e spero che tu saprai chiarirmi le idee... Grazie ancora

  6. #6
    Allora deployare o no nello stesso ear oppure in moduli separati non crea i problemi da te indicati ovviamente se effettui il primo punto che ti ho segnalato, cioè la corretta configurazione del modulo ejb per consentire la generazione del client, altrimenti come sta succedendo a te (sinceramente io con la configurazione da te postata non riesco neanche a deployare quei progetti....) molto probabilmente ti viene inserito tutto il modulo ejb nei progetti web e come dici tu e come se avessi 3 deploy differenti del modulo ejb.

    Per quanto riguarda la mappa statica non è un buon approccio perchè come dici tu ti sei fatto un'idea errata di cosa sia un ejb...
    Prima di tutto perchè un ejb a un ciclo di vita cosa succede alla tua mappa statica quando l'ultimo riferimento di un ejb viene passivato.... oppure cosa succede se si vuole deployare il modulo ejb su 2 application server clustered .... se vuoi continuo....

    Tieni anche conto della differenza tra un Ejb Stateless e StateFull (questo nel caso pensasi di inserire proprietà all'interno di un ejb..)....

    Il concetto che sta alla base di un ejb (cioè per rispondere alla tua domanda a cosa servorno) è che stanno nel mezzo tra lo strato presentation e model cioè seguendo il pattern MVC gli ejb sono i Controller.
    Un controller di per se non può contenere dati di scambio fra i vari client ma solo occuparsi di "recuperali" da qualche struttura dati che sia un file o un database poco importa.

    Domanda devi per forza divedere i 2 progetti web ?
    Perchè potresti tranquillamente usarne uno solo utilizzando eventualmente un security-context per gestire le 2 tipologie di utenti.

  7. #7
    Ribadisco ch'è solo un esempio per capire bene il funzionamento infatti sarebbe più comodo gestire i permessi invece che avere 2 moduli divisi... ritornando al fatto della Mappa statica ho capito che è sbagliato avere il dato statico nell'EJB ma in realtà la variabile statica si trova in una classe esterna all'EJB e quindi non legata alla vita dell'EJB stesso esatto?.

    Variabile statica: https://github.com/AndreaCatania/Ejb...taticTest.java
    EJB: https://github.com/AndreaCatania/Ejb.../TheNamer.java

    Poniamo il caso che creo un modulo "core" che contiene le classi usate per la gestione del DB e altri meccanismi vari, è corretto avere gli EJB dentro questo modulo per dare la possibilità ad altri moduli d' interagirvi?
    In questo caso se avessi bisogno di una variabile statica su queste classi (non EJB) potrei usarle esatto?

    Inoltre ho notato che non avevo caricato le modifiche su git, se ricontrollassi adesso potresti vedere che la configurazione è proprio come hai detto tu, e non va lo stesso

  8. #8
    Io ancora vedo questo:
    codice:
    <plugin>
    
    
                   <groupId>org.apache.maven.plugins</groupId>
    
    
                   <artifactId>maven-ejb-plugin</artifactId>
    
    
                   <version>2.3</version>
    
    
                   <configuration>
    
    
                       <!--ejbVersion>3.1</ejbVersion-->
    
    
                       <generateClient>true</generateClient>
    
    
                   </configuration>
    
    
               </plugin>

  9. #9
    Non capisco bene cosa devo fare, devo rimuovere il tag "ejbVersion" o tutto il plugin? perche quel tag è commentato

  10. #10
    Come da promessa sono qui...
    Allora per prima cosi il link di un progetto di esempio : https://github.com/francescomuia/library
    Dentro ci sono 2 Test che poi lanciare rispettivamente per la parte Client e Admin context-root dei due progetti sono library-web-user e library-web-admin dentro vi è un index html che ti permette di chiamare due servlet di test.
    La prima servlet è stata fatta con la proprietà statica cosi come volevi tu.
    La seconda invece diciamo che è + object oriented è sfrutta i Singleton Ejb introdotti appunto nella specifica 3.1

    Ma veniamo alle cose importanti, cioè come configurare il modulo ejb per generare correttamente il client da usare la configurazione dell'esempio è questa:
    codice:
    <plugin>
    	<groupId>org.apache.maven.plugins</groupId>
    	<artifactId>maven-ejb-plugin</artifactId>
    	<configuration>
    		<ejbVersion>3.1</ejbVersion>
    		<generateClient>true</generateClient>
    	</configuration>
    </plugin>
    Che è praticamente la configurazione di default per generare il client. Per il mio progetto basta questa perchè di default il plugin mi esclude tutte le classi che matchano con le seguenti regex :
    codice:
    **/*Bean.class
    **/*CMP.class
    **/*Session.class
    **/package.html
    E dato che tutti i miei ejb anno il suffiso "Bean" queste classi non verrano include nel client ejb e quindi non verranno deployate n volte.
    Ovviamente l'inclusione/esclusione è ulteriormente configurabile

    Ciauz

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.