Wie kann ich die lokale Schnittstelle für eine EJB wählen?
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.
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