Aufruf einer EJB 3 aus einer normalen Java-Klasse

Dieses Thema Aufruf einer EJB 3 aus einer normalen Java-Klasse im Forum "Application Tier" wurde erstellt von Red Baron, 22. Mai 2014.

Thema: Aufruf einer EJB 3 aus einer normalen Java-Klasse Hallo, ich möchte in meiner Anwendung EJB 3 verwenden. Die Anwendung läuft in einem Websphere Application Server 8....

  1. 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
    Code (Java):
    import javax.ejb.Remote;

    @Remote
    public interface EjbTestRemote {

        public void doSth();

    }
    EJB
    Code (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)
    Code (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!
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. 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:
    Code (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: 17. Juni 2014
  4. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!