Frage

Sagen wir, ich habe folgende EJB (mit EJB3):

@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
    ...
}

Die Klasse ist durch die verfügbare sowohl eine lokale und Remote-Schnittstelle.

Wie kann ich die lokale Schnittstelle für dieses EJB in einem anderen Teil der App injizieren?

Insbesondere, ich bin nicht sicher, wie eine @EJB Anmerkung zu erstellen, die den lokale wählen Schnittstelle. Zum Beispiel ist die folgende ausreichend?

@EJB(name="Queries") private Queries queries;

Insbesondere möchte ich verschiedene lokale und Remote-Schnittstellen einfach zu dem Zweck zu vermeiden, die Schaffung der Unterscheidung über Eigentum ‚beanInterface‘ s @ EJB.

War es hilfreich?

Lösung

Nach der Spezifikation Sie können nicht über eine Schnittstelle, die Remote und Local zugleich ist. Allerdings erstellen Sie eine super-Schnittstelle, setzen alle Methoden gibt, und dann zwei Unterschnittstellen erstellen. Nachdem das erledigt, verwenden Sie einfach @EJB. Auf diese Weise müssen Sie nur eine Schnittstelle überhaupt aufrecht zu erhalten.

EDIT: Abschnitt 3.2 in "EJB3 spec vereinfacht" Siehe unter http: / /jcp.org/aboutJava/communityprocess/final/jsr220/index.html

Andere Tipps

Wenn ein EJB bereitgestellt wird, sieht der Behälter an den Schnittstellen und identifiziert lokale und Remote-Schnittstellen. Ich würde sagen, dass die EJB-Container bereits die lokale Schnittstelle in Ihrem Beispiel verwendet. Es ist einfach nicht Sinn macht eine Remote-Schnittstelle in diesem Fall zu verwenden, da der Behälter die Wahl die lokalen eine verwenden hat.

Wenn Sie sicher versuchen, den JNDI-Namen des lokalen Schnittstelle als Parameter der @EJB Anmerkung zu verwenden.

@EJB(name="java:comp/env/ejb/EntitySupplierLocal")

In dem obigen Beispiel I lokal auf den Interface-Namen hinzugefügt. In Ihrem Fall haben Sie einen Blick auf dem JNDI Kontext nehmen Sie die richtigen Namen zu erhalten, oder Sie selbst wissen es;)

.

Generell empfehle ich eine Basis-Schnittstelle zu verwenden, die die Geschäfts methodes definiert hat und sich eine lokale und eine Remote-Schnittstelle. So müssen Sie nicht methodes duplizieren und Sie sind in der Lage seperatly Funktionalität für lokalen und Remote-Zugriff zu erweitern.

public interface Queries () { .. }

@Local
public interface QueriesLocal extends Queries () { .. }

@Remote
public interface QueriesRemote extends Queries () { .. }

Lösungen aus früheren Kommentaren sind nicht vollständig compatibile mit EJB 3.0 auf Jboss.

Sie können einfach, diesen Fehler:

org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException:
beanInterface specified, Queries, is not unique within EJB QueriesEJB

Erstellen Sie nur dies:

public interface Queries ()  //Local by default

@Remote
public interface QueriesRemote extends Queries () { ... }

Es funktioniert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top