Aufruf einer EJB 3 aus einer normalen Java-Klasse

Diskutiere Aufruf einer EJB 3 aus einer normalen Java-Klasse im Application Tier Bereich.
R

Red Baron

Hallo, ich möchte in meiner Anwendung EJB 3 verwenden. Die Anwendung läuft in einem Websphere Application Server 8.
Die EJBs sollen aus einer normalen Java-Klasse (liegt auf dem Server, wird von einem Servlet aufgerufen) aufgerufen werden. So wie ich es verstanden habe, kann ich dann nicht mit Dependency-Injection arbeiten. Stattdessen müsste der Aufruf der Bean über den InitialContext erfolgen. Allerdings bekomme ich immer eine NameNotFoundException.

Folgende Klassen habe ich angelegt:

Remote-Interface
Java:
import javax.ejb.Remote;

@Remote
public interface EjbTestRemote {

	public void doSth();

}
EJB
Java:
import javax.ejb.Stateless;

@Stateless
public class EjbTest implements EjbTestRemote {

	@Override
	public void doSth() {
		System.out.println("Hello world!");
	}

}
Aufrufende Java-Klasse (kein Servlet)
Java:
try {
			InitialContext ctx = new InitialContext();
			Object o = ctx.lookup("package.EjbTestRemote");
		} catch (NamingException e) {
			e.printStackTrace();
		}
In der aufrufenden Klasse habe ich schon etliche andere Konstellationen beim Aufruf von lookup() übergeben aber immer kommt es zum selben Fehler.

Hat jemand eine Idee, woran es liegen könnte?

Danke!
 
J

JeromeC

Das @Remote-Interface brauchst du nicht, da dein EJB nur aus dieser JVM heraus aufgerufen werden soll.
Daher bräuchtest du höchstens @LocalBean in deiner Bean-Klasse, was aber standardmäßig angenommen wird wenn kein anderes Interface definiert ist.

Wenn du dein Bean deployst musst du den JNDI-Namen auslesen. Dieser sieht ungefähr so aus: "java:global/...".
Dein lookup muss dann wie folgt passieren:
Java:
try {
 InitialContext ctx = new InitialContext();
 EjbTest myBean = (EjbTest) ctx.lookup("java:global/foo/EjbTest");
} catch (NamingException e) {
 e.printStackTrace();
}
Vergiss nicht, dass die aufrufende Klasse das zu parsende Objekt kennen möchte. Daher irgendwo in den Dependencies deine Klasse bekannt machen: deployment.DeinEjbProjektName.jar (zumindestens bei JBoss, kann nicht für WebSphere sprechen).
 
Zuletzt bearbeitet:
Thema: 

Aufruf einer EJB 3 aus einer normalen Java-Klasse

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben