Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27

    Iniezione tra EJB di progetti diversi

    Salve, ho da poco iniziato a lavorare per motivi universitari con EJB 3.X , uso Eclipse EE e Jboss 7,
    ho riscontrato un problema e non riesco a venirne a capo nonostante le numerose ricerche.

    Sto testando l'injection di un EJB all'interno di un altro. I bean stateless e implementati in progetti diversi.

    Il primo ExampleSessionBean con relative interfacce Locale/Remota nel primo progetto.

    codice:
    package example;
    
    
    import javax.ejb.EJB;
    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    
    
    @Stateless
    public class ExampleSessionBean implements ExampleSessionBeanRemote, ExampleSessionBeanLocal  {
        
        public String f(){
        	return "ciao";
        }
    
    
    }
    Il secondo PonteSessionBean e relative interfacce nel secondo.

    codice:
    package ponte;
    
    
    import javax.ejb.EJB;
    import javax.ejb.Stateless;
    
    
    import example.ExampleSessionBeanLocal;
    
    
    @Stateless
    public class PonteSessionBean implements PonteSessionBeanLocal, PonteSessionBeanRemote {
    
    
    	@EJB	
    	ExampleSessionBeanLocal sb;
    	
    	public String f(){
    		return sb.f();
        }
    }
    L'idea è tramite un client Java richiamare "Ponte", che richiama "ExampleSessionBean" che ritorna una stringa.

    Il primo Bean viene deployato correttamente e funziona anche se invocato direttamente con il Client.

    Il secondo Bean "Ponte" invece non riesco a deployarlo poichè non trova l'implementazione del primo bean nonostante l'abbia comunque inserito nel "build path".

    Stessa cosa se provo l'injection da una Servlet.

    C'è da dire che se il bean "ponte" lo inserisco nello stesso progetto del bean "example" sia sotto lo stesso package che in un packege diverso il deploy e l'injection funziona correttamente.

    Quindi perchè non funziona se li metto in PROGETTI diversi?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Java ha una sezione dedicata.
    Sposto la discussione.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Java ha una sezione dedicata.
    Sposto la discussione.

    Ciao.

    scusa, grazie!

  4. #4
    Sicuramente sarebbe utile avere l'eccezione generata, da quello che dici sembra che tu abbia un ClassNotFoundException (nel progetto dell'ejb "Ponte" adrebbero inserite le interfacce del ejb "Example"). Ma sicuramente anche facendo cosi non ti funzionerebbe in quanto tu stai tentando un injection di un interfaccia di un ejb locale che però risiede in un'altro progetto e questo non è permesso da quasi tutti i JavaEE container. Quindi sicuramente l'ejb da inniettare sarebbe quello remoto. E per far si che l'injection funzioni con un ejb remoto va configurato il lookup di quest'ultimo.
    Ultima modifica di francesco.muia; 13-11-2014 a 11:13

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Quote Originariamente inviata da francesco.muia Visualizza il messaggio
    E per far si che l'injection funzioni con un ejb remoto va configurato il lookup di quest'ultimo.
    Si l'eccezione è quella, cercavo di usare l'interfaccia local poiché volendo mettere gli ejb sullo stesso container mi sembrava quella più appropriata, appena torno a casa provo con quella remota (anche se forse avevo già provato, non ricordo)...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Quote Originariamente inviata da MRK89 Visualizza il messaggio
    Si l'eccezione è quella, cercavo di usare l'interfaccia local poiché volendo mettere gli ejb sullo stesso container mi sembrava quella più appropriata, appena torno a casa provo con quella remota (anche se forse avevo già provato, non ricordo)...
    Ho provato con interfaccia remota:

    @EJB
    private ExampleSessionBeanRemote sb;

    ma forse, per Ejb remoto non intendevi l'interfaccia

    quindi la risposta alla domanda: "perchè non funziona se li metto in PROGETTI diversi?"
    sarebbe che non si può fare l'injection di ejb di progetti diversi con il semplice @EJB private nomeinterfaccia oggetto; ?

    Ho notato che se li raggruppo sotto un Enterprise Application Project e deployo l'ear funziona tutto correttamente... però deployando i jar degli ejb separatemente no



    Riporto l'errore:
    codice:
    11:33:41,035 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-2) MSC00001: Failed to start service jboss.deployment.unit."PonteSessionBean.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."PonteSessionBean.jar".POST_MODULE: Failed to process phase POST_MODULE of deployment "PonteSessionBean.jar"
    	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:119) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
    	at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    	at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [rt.jar:1.7.0_60]
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [rt.jar:1.7.0_60]
    	at java.lang.Thread.run(Unknown Source) [rt.jar:1.7.0_60]
    Caused by: java.lang.RuntimeException: Error getting reflective information for class ponte.PonteSessionBean with ClassLoader ModuleClassLoader for Module "deployment.PonteSessionBean.jar:main" from Service Module Loader
    	at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:70) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
    	at org.jboss.as.ee.metadata.MethodAnnotationAggregator.runtimeAnnotationInformation(MethodAnnotationAggregator.java:58)
    	at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.handleAnnotations(InterceptorAnnotationProcessor.java:85)
    	at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.processComponentConfig(InterceptorAnnotationProcessor.java:70)
    	at org.jboss.as.ee.component.deployers.InterceptorAnnotationProcessor.deploy(InterceptorAnnotationProcessor.java:55)
    	at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
    	... 5 more
    Caused by: java.lang.NoClassDefFoundError: Lexample/ExampleSessionBeanRemote;
    	at java.lang.Class.getDeclaredFields0(Native Method) [rt.jar:1.7.0_60]
    	at java.lang.Class.privateGetDeclaredFields(Unknown Source) [rt.jar:1.7.0_60]
    	at java.lang.Class.getDeclaredFields(Unknown Source) [rt.jar:1.7.0_60]
    	at org.jboss.as.server.deployment.reflect.ClassReflectionIndex.<init>(ClassReflectionIndex.java:57) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
    	at org.jboss.as.server.deployment.reflect.DeploymentReflectionIndex.getClassIndex(DeploymentReflectionIndex.java:66) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
    	... 10 more
    Caused by: java.lang.ClassNotFoundException: example.ExampleSessionBeanRemote from [Module "deployment.PonteSessionBean.jar:main" from Service Module Loader]
    	at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
    	at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
    	at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
    	at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
    	at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    	... 15 more
    
    
    11:33:41,084 INFO  [org.jboss.as.server] (DeploymentScanner-threads - 2) JBAS015870: Deploy of deployment "PonteSessionBean.jar" was rolled back with failure message {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"PonteSessionBean.jar\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"PonteSessionBean.jar\".POST_MODULE: Failed to process phase POST_MODULE of deployment \"PonteSessionBean.jar\""}}
    11:33:41,097 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015877: Stopped deployment PonteSessionBean.jar in 10ms
    11:33:41,101 INFO  [org.jboss.as.controller] (DeploymentScanner-threads - 2) JBAS014774: Service status report
    JBAS014777:   Services which failed to start:      service jboss.deployment.unit."PonteSessionBean.jar".POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."PonteSessionBean.jar".POST_MODULE: Failed to process phase POST_MODULE of deployment "PonteSessionBean.jar"
    
    
    11:33:41,106 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 1) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.unit.\"PonteSessionBean.jar\".POST_MODULE" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"PonteSessionBean.jar\".POST_MODULE: Failed to process phase POST_MODULE of deployment \"PonteSessionBean.jar\""}}}}
    Ultima modifica di MRK89; 13-11-2014 a 12:46

  7. #7
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    nel progetto che contiene PonteSessionBean devi metterci almeno anche le interfacce di acceso. In genere io faccio un terzo progetto con solo le interfacce e lo metto come dipendenza degli altri due.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    27
    Ho provato a mettere l'interfacce l'errore diventa questo:

    codice:
    Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS014544: No EJB found with interface of type 'ponte.ExampleSessionBeanRemote' for binding ponte.PonteSessionBean/sb
    	at org.jboss.as.ejb3.deployment.processors.EjbInjectionSource.getResourceValue(EjbInjectionSource.java:88)
    	at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.processBindings(ComponentInstallProcessor.java:245)
    	at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.access$000(ComponentInstallProcessor.java:74)
    	at org.jboss.as.ee.component.deployers.ComponentInstallProcessor$1.handle(ComponentInstallProcessor.java:199)
    	at org.jboss.as.ee.component.ClassDescriptionTraversal.run(ClassDescriptionTraversal.java:54)
    	at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deployComponent(ComponentInstallProcessor.java:195)
    	at org.jboss.as.ee.component.deployers.ComponentInstallProcessor.deploy(ComponentInstallProcessor.java:93)
    	... 6 more
    mentre nel primo caso il prof. dice che potrebbe essere un problema legato al classloader, vedremo....

  9. #9
    Allora dall'ultimo stack trace mi sono accorto che il container sta effettuando il binding di ponte.ExampleSessionRemote mentre il tuo ejb "ExampleSessionRemote" è dentro il package "Example" come suppongo le sue interfacce. Quindi mi sa che non stai linkando correttamente le interfacce del primo ejb nel secondo progetto

  10. #10
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    per fare un po' di chiarezza, l'interfaccia local la usi all'interno della stessa applicazione, ear compresi. La remote la usi per far comunicare applicazioni diverse, potenzialmente remote. Quindi anche se fai il deploy delle due applicazioni sullo stesso application server per farle comunicare comunque devi passare dalla remote.

    Cio` detto devi anche stare attento al package, che nel caso degli ejb ha una struttura particolare. Qualche link utile:
    https://docs.oracle.com/cd/E19798-01...pnz/index.html
    http://www.mastertheboss.com/jboss-s...lient-tutorial

    Personalmente ho sempre usato la local, fornendo il jar ejb come dipendenza dell'applicazione principale, quindi piu` di cosi` non posso aiutarti.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.