2016-10-31 4 views
0

Ich habe eine EAR-Anwendung mit drei Modulen:Inject von Remote-EJB-Schnittstelle in ein externes Modul

  • Bohnen sind in "app-ejb" Modul
  • Remote-Schnittstellen in "app-remote" sind
  • Webdienste sind in "app-war"
  • app-ejb und app-war verwenden app-remote als Bibliothek.

Alle sind in "app.ear" verpackt.

Das funktioniert gut, aber jetzt muss ich die gleichen Bohnen außerhalb der EAR-Anwendung verwenden, und die Injektion funktioniert nicht.

Ich habe in app-ejb:

@Stateless 
@LocalBean 
public class Services implements ServicesRemote { 
    [...] 
} 

und seine Remote-Schnittstelle in app-Fernbedienung:

@Remote 
public interface ServicesRemote { 
    [...] 
} 

In meinem app-Krieg ich die Remote-Bohne problemlos injizieren können:

Wie auch immer in meiner externen EJB-Anwendung, als Stand-Alone-und die Verwendung der gleichen EJB-Remote als Bibliothek, wenn ich t ry die gleiche EJB wie diese zu injizieren:

@Stateless 
@LocalBean 
public class UseServicesFromAnotherApp { 
    @EJB 
    private ServicesRemote services; 
    [...] 
} 

Glassfish (4.1) geben Sie mir einen Fehler „Klasse [Lcom /[...]/ ServicesRemote; ] Nicht gefunden“.

dies erwartet? Wie kann ich die Remote-Bohne richtig spritzen?

+0

können Sie bitte den gesamten Protokollfehler posten? – davidxxx

+0

gibt es keine "ganze Fehlerprotokoll", die einzige Zeile, die ich bekomme ist: [2016-10-31T14: 38: 47.657-0300] [Glassfish 4.1] [SEVERE] [] [global] [tid: _ThreadID = 43 _ThreadName = admin-listener (3)] [timeMillis: 1477935527657] [levelValue: 1000] [[ Klasse [Lcom /..../ ServicesRemote; ] nicht gefunden. Fehler beim Laden [Klasse com .... UseServicesFromAnotherApp]]] –

Antwort

0

Das Problem wurde wahrscheinlich durch eine Reihe von Hot-Deploy erzeugt, Glassfish instabil gemacht. Als ich Glassfish neu gestartet habe, fängt mein Code an, richtig zu arbeiten (es funktioniert tatsächlich noch).

Es tut uns leid, hier zu posten, ohne zuerst glassfish neu starten zu müssen.

1

Injection nicht mit Remote-Schnittstellen funktioniert. Beans, die‚injizierbaren‘, leben im Inneren des Behälters JVM und sind für Die gleiche Anwendung gilt für den Zugriff auf Beans in einer anderen Anwendung im selben Container, obwohl sich Anwendungen in derselben JVM befinden können Da Remote-Methoden von einer anderen JVM oder einer anderen Anwendung stammen, ist eine Injektion nicht möglich. Sie müssen stattdessen JNDI-Lookup verwenden, um eine Referenz auf eine Remote-Bean zu erhalten.

Als eine Sache oder persönlichen Geschmack, würde ich fern von EJB Remote interfa bleiben Ich würde stattdessen eine andere "Remoting" -Technik wie REST verwenden.

+0

Ich habe eine Menge von Java-EE-Anwendung mit Remote-Schnittstellen und funktioniert gut.In der Tat ist das, was Sie geschrieben haben, falsch, da die Orakeldokumentation sagt: "Clientzugriff auf eine Enterprise-Bean, die eine Remote-Business-Schnittstelle implementiert, entweder durch Dependency-Injektion oder JNDI-Lookup" hier http://docs.oracle.com/javaee/6 /tutorial/doc/gipjf.html#gipiu - In der Tat, wenn ich Glassfish neu gestartet, beginnen Injektion richtig und es funktioniert eigentlich immer noch ohne Problem. –

+0

Kein normaler Glasfish-Benutzer. Mein Verständnis davon ist, dass Sie eine Remote injizieren können, soweit die Anwendung sowohl die ejb.jar als auch den Client enthält, der ein anderes Kriegs-, ejb-Modul usw. sein kann. Ich sehe den Nutzen davon nicht, wenn lokale Schnittstellen verwendet werden könnten stattdessen. – garfield

+0

Es ist nützlich, wenn Sie möchten, dass Ihre App bereit ist, wenn Sie Ihre EJB- und War-Module trennen müssen. –

Verwandte Themen