2010-03-01 4 views
6

Wie kann ich in Weblogic 10.3 eine Remote-EJB von einer EAR in eine Stateless-Bean einer anderen injizieren, wobei beide EARs im selben Container bereitgestellt werden? Idealerweise möchte ich so viel wie möglich mit Anmerkungen machen.Wie rufe ich eine entfernte EJB in einer EAR von einer anderen an?

Also nehme ich die folgende Schnittstelle:

public interface HelloService { 
    public String hello(); 
} 

durch die folgende EJB implementiert:

@Stateless 
@Remote 
public class HelloServiceBean implements HelloService { 
    public String hello() { 
     return "hello"; 
    } 
} 

Angenommen, sie sind in server.ear verpackt und eingesetzt werden. Jetzt in client.ear, ich habe folgendes:

@Stateless 
public class HelloClientBean { 
    @EJB 
    HelloService helloService; 

// other methods... 
} 

Was muss ich hinzufügen, so dass Weblogic die Verdrahtung korrekt zwischen HelloClientBean in client.ear und HelloServiceBean in server.ear herausfindet? Hinweise auf offizielle Dokumentationen und/oder Bücher sind herzlich willkommen.

+0

Schamlose Beule. Alles, was ich bisher herausgefunden habe, ist, dass Weblogic eine mit @Stateless (mappedName = "foo") annotierte statuslose Bean an "foo # fully.qualified.interface.name" in JNDI bindet. Aber wie soll ich dann mein 'HalloService'-Feld in' HalloClientBean' annotieren? – lindelof

Antwort

4

Die einfachste Lösung, die ich bisher gefunden habe, ist die folgende.

Zuerst mit Anmerkungen versehen, die staatenlos Bohne mit einem mappedName Attribut:

@Stateless(mappedName="HelloService") 
@Remote 
public class HelloServiceBean implements HelloService { 
    public String hello() { 
     return "hello"; 
    } 
} 

Nach http://forums.oracle.com/forums/thread.jspa?threadID=800314&tstart=1, Weblogic wird nie ein JNDI-Eintrag für einen EJB erstellen, es sei denn ein JNDI-Namen als mappedName Attribut angegeben ist (oder in der Deployment-Deskriptor oder in einer proprietären Annotation).

Als nächstes können Sie nun Ihr Client-Feld mit @EJB mit einem mappedName Attribut mit Anmerkungen versehen, die auf dem Server-Beandas gleiche wie das Attribut sein sollte. (Ich bin ehrlich dadurch verwirrt NameNotFoundException when calling a EJB in Weblogic 10.3 schlägt vor, dass ich in der Lage sein sollte, die mappedName#interfaceName Syntax zu verwenden, aber in meinen Tests funktioniert das nicht..):

@Stateless 
public class HelloClientBean { 
    @EJB(mappedName="HelloService") 
    HelloService helloService; 

// other methods... 
} 

Dies funktioniert jetzt, solange beiden Ohren in demselben Container bereitgestellt. Als nächstes werde ich versuchen, die richtige Syntax herauszufinden, wenn sie auf verschiedenen Rechnern eingesetzt werden.

+0

Benennen ist hilfreichI und funktioniert gut, aber nicht für die Anpassung geeignet. Jede Konfigurationsänderung hat Auswirkungen auf Ihren Code. Die EJB jar xml-Konfiguration oder eine Konfiguration, die beim Start über CDI injiziert/proxiiert wird, würde das Gleiche tun, aber Sie können es auch parametrisieren, was die Wartungs- und Implementierungskapazität erhöht. – kij

+0

EJBs, die zugeordnete Namen verwenden, sind möglicherweise nicht tragbar. –

Verwandte Themen