2009-03-11 14 views
0

sagen, ich habe die folgende EJB (mit EJB3):Wie kann ich die lokale Schnittstelle für ein EJB auswählen?

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

Die Klasse sowohl durch eine lokale und Remote-Schnittstelle zur Verfügung.

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

Insbesondere bin ich mir nicht sicher, wie man eine @ EJB Annotation erstellt, die die lokale Schnittstelle auswählt. Zum Beispiel ist das Folgende ausreichend?

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

Insbesondere möchte ich Eigenschaft ‚beanInterface‘ ist zu unterscheiden, via @ EJB verschiedene lokale und Remote-Schnittstellen einfach zu dem Zweck zu vermeiden, zu schaffen.

Antwort

3

Je nach Spezifikation können Sie keine Schnittstelle haben, die Remote und Local gleichzeitig ist. Sie erstellen jedoch eine Superschnittstelle, stellen alle Methoden dort ein und erstellen dann 2 Subschnittstellen. Danach verwenden Sie einfach @EJB. Auf diese Weise müssen Sie nur eine Schnittstelle beibehalten.

EDIT: http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html bei den letzten Kommentaren

+0

Haben Sie die Spezifikationsreferenz dafür? – johnstok

+0

1. Gehen Sie zu http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html 2. Klicken Sie auf "Klicken Sie auf die Schaltfläche unten, um die Spezifikation für die Evaluierung herunterzuladen oder um eine Anwendung zu erstellen, die die Spezifikation verwendet" 3. Laden Sie ejb-3_0-fr-spec-simplified.pdf herunter 4. Gehen Sie zu Seite 16, Punkt 3.2 – Antonio

1

Wenn ein EJB bereitgestellt wird, untersucht der Container die Schnittstellen und identifiziert lokale und Remote-Schnittstellen. Ich würde sagen, dass der EJB-Container in Ihrem Beispiel bereits die lokale Schnittstelle verwendet. Es ist einfach nicht sinnvoll, in diesem Fall eine Remote-Schnittstelle zu verwenden, da der Container die Wahl hat, die lokale Schnittstelle zu verwenden.

Wenn Sie sicher gehen wollen, versuchen Sie, den JNDI-Namen der lokalen Schnittstelle als Parameter der @ EJB-Annotation zu verwenden.

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

Im obigen Beispiel habe ich local zum Namen der Schnittstelle hinzugefügt. In Ihrem Fall müssen Sie einen Blick auf den JNDI-Kontext werfen, um den richtigen Namen zu erhalten, oder Sie kennen ihn sogar;).

Im Allgemeinen empfehle ich, eine Basisschnittstelle zu verwenden, die die Geschäftsmethoden definiert und eine lokale und eine Remote-Schnittstelle erweitert. Sie müssen also keine Methoden duplizieren und können die Funktionalität für lokalen und Remote-Zugriff separat erweitern.

public interface Queries() { .. } 

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

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

Ich habe versucht, dies in jBoss und die Remote-Schnittstelle ausgewählt wurde - Figur gehen .. – johnstok

1

Lösungen Abschnitt 3.2 in "EJB3 spec vereinfacht" Sehen nicht vollständig compatibile mit EJB 3.0 auf Jboss.

Sie können einfach diese Fehlermeldung erhalten:

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

erstellen nur das:

public interface Queries() //Local by default 

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

Es funktioniert

Verwandte Themen