Enterprise Java Beans (EJB) sind für viele der Enterpriseanwendungsentwickler heutzutage nicht mehr wegzudenken. Wie es nun aber mal bei Java ist, kursieren im Internet 1000 Fragen auf eine Erklärung. Um die magere Quote von 1000:1 ein bisschen aufzuwerten möchte ich hier eine kurze Anleitung schreiben, wie man aus einer Client-Anwendung eine EJB auf einem Anwendungsserver auffindig macht um dann eine Methode daraus aufzurufen.
Schritt 1: Finde die Bohne und führe Methode aus
Eine EJB über das Java Naming and Directory Interface (JNDI) zu finden ist kein Hexenwerk. Das Aufrufen ist ebenso simpel. Bitte beachten, dass hier keine Exceptions gefangen werden!
public void callMyMethodFromEJB() { Object object = null; MyEJBHome ejbHome = null; InitialContext ic = new InitialContext(); object = ic.lookup("/ejb/de/jofre/MyEJBHome"); ejbHome = (MyEJBHome) PortableRemoteObject.narrow(object, MyEJBHome.class); MyEJBRemote ejbRemote = ejbHome.create(); ejbRemote.myMethod(); } |
Schritt 0: Bereite das Client-Projekt vor
Hier kommt der Schritt über den ich als Anfänger gestolpert bin. Damit die Clientanwendung die Klassen aus der Bean kennt (z.B. MyEJBRemote oder MyEJBHome) müsst ihr eine EJB-Client.jar erzeugen. Das machen moderne IDEs automatisch wenn ihr sie denn darum bittet. Bei Eclipse reicht ein Rechtsklick auf das EJB-Projekt und unter Java EE -> Create EJB Client Jar findet ihr die gewünschte Funktion.
Diese Jar müsst ihr nun der Client-Anwendung als Projekt Utility JAR mitgeben. In Eclipse findet ihr diese Option im Deployment Descriptor des EAR-Files unter Module. Dann fügt ihr im Clientprojekt noch die erzeugte Jar als Java EE Module Dependency hinzu. Das funktioniert über Rechtsklick auf das Projekt -> Java EE Module Dependencies.
Nun deployt ihr das Clientprojekt sowie das Projekt, dass die EJB(s) enthält und schon wird das ganze Laufen.
Solltet ihr den letzten Schritt nicht durchführen oder gar das EJB-Projekt (Ich spreche hier nicht von der Client-Jar!) als Module Java EE Module Dependency mitgeben führt ersteres zu den bekannten ClassNotFoundExceptions oder aber, schlimmer, letzteres dazu, dass die Anwendung in denen sich die EJBs befinden nicht startet, weil die EJBs ja auch schon in dem Clientprojekt mitdeployt werden und die Anwendungsserver sich weigern (sollten) die EJBs doppelt zu deployen. Schließlich kann der Anwendungsserver ja dann nicht wissen wie er reagieren soll, wenn ein Objekt über JNDI angefragt wird und davon mehrere existieren.