2010-03-01 7 views
6

Dans Weblogic 10.3, comment injecter un EJB distant d'un EAR dans un bean sans état d'un autre, les deux EAR étant déployés dans le même conteneur? Idéalement, j'aimerais en faire autant que possible avec des annotations.Comment appeler un EJB distant dans un fichier EAR d'un autre?

suppose donc je l'interface suivante:

public interface HelloService { 
    public String hello(); 
} 

mis en œuvre par l'EJB suivant:

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

On suppose qu'ils sont emballés et déployés dans server.ear. Maintenant en client.ear, je donne les résultats suivants:

@Stateless 
public class HelloClientBean { 
    @EJB 
    HelloService helloService; 

// other methods... 
} 

Que dois-je ajouter pour que Weblogic figure le câblage correctement entre HelloClientBean dans client.ear et HelloServiceBean à server.ear? Les pointeurs vers les documentations officielles et/ou les livres sont les bienvenus.

+0

Bosse éhontée. Tout ce que j'ai compris jusqu'ici est que Weblogic liera un bean sans état annoté avec @Stateless (mappedName = "foo") à "foo # fully.qualified.interface.name" dans JNDI. Mais comment puis-je annoter mon champ 'helloService' dans' HelloClientBean'? – lindelof

Répondre

4

La solution la plus simple que j'ai trouvée jusqu'ici est la suivante.

D'abord, annoter le bean sans état avec un attribut mappedName:

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

Selon http://forums.oracle.com/forums/thread.jspa?threadID=800314&tstart=1, Weblogic ne créerons jamais une entrée JNDI pour un EJB à moins qu'un nom JNDI est donnée comme l'attribut mappedName (ou dans le descripteur de déploiement, ou dans une annotation propriétaire).

Ensuite, vous pouvez maintenant annoter votre champ client @EJB avec un attribut mappedName, qui devrait être le même que l'attribut sur le haricot serveur. (Je suis sincèrement déconcerté par cette NameNotFoundException when calling a EJB in Weblogic 10.3 suggère que je devrais être en mesure d'utiliser la syntaxe mappedName#interfaceName, mais dans mes tests cela ne fonctionne pas..):

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

// other methods... 
} 

Cela fonctionne maintenant, tant que les deux oreilles sont déployé dans le même conteneur. Ensuite, je vais essayer de comprendre la bonne syntaxe quand ils sont déployés sur des machines différentes.

+0

L'utilisation du nommage est utile et fonctionne bien, mais ne convient pas à la personnalisation. Toute modification de la configuration aura un impact sur votre code. La configuration EJB jar xml ou une configuration injection/proxication au démarrage via CDI ferait de même, mais vous permet également de le paramétriser, augmentant ainsi la capacité de maintenance et de déploiement. – kij

+0

Les EJB qui utilisent des noms mappés peuvent ne pas être portables. –

Questions connexes