2010-01-16 5 views
4

Je reçois l'exception suivante lorsqu'une interface locale est implémentée par deux beans sans état, dans lequel un ayant des fonctionnalités normales et d'autres ayant des fonctionnalités améliorées.n'est-il pas autorisé à implémenter une interface locale unique par deux beans sans état?

java.lang.RuntimeException: ne pouvait pas résoudre le nom JNDI global pour @EJB pour conteneur UserBean: classe de référence: org.app.SecurityServiceLocal ejbLink: double dans Some.jar

Répondre

3

Enfin je suis venu pour savoir pourquoi je reçois cette exception

Je l'ai utilisé l'annotation @EJB pour injecter un haricot Stateless dans un autre bean sans état Nom UserBean avec le code suivant

@Stateless(name="UserBean") 
@EJB(name="app/SecurityService", 
     beanInterface=SecurityServiceLocal.class) 
public class UserBean implements UserRemote{ 

} 

Si vous cochez la détails de l'injection J'injectait SecurityServiceLocal, qui a été implémenté par deux classes de bean Stateless: SercurityServiceBean et SecurityServiceEnhaBean. Ainsi, le conteneur est dans l'état d'ambiguïté pour décider dans quel bean injecter car les deux implémentent la même interface.

Ceci peut être résolu en spécifiant d'autres informations telles que beanName valeur de propriété dans l'annotation @EJB. Là, vous devez indiquer quelle classe de bean sans état doit être injectée en utilisant le nom du bean (déclaré à ce niveau de bean (ou) dans le fichier ejb-jar.xml). vérifier le code pour identifier le changement dans la cartographie d'injection

@Stateless(name="UserBean") 
@EJB(name="app/SecurityService", 
     beanInterface=SecurityServiceLocal.class, 
     beanName="SecurityServiceEnha") 
public class UserBean implements UserRemote{ 

} 
0

C'est difficile à dire à coup sûr sans voir le code. Une bonne première étape serait d'utiliser l'attribut optionnel mappedName = "" sur l'annotation de vos beans de session pour donner à chacun un nom JNDI unique. Vous devrez utiliser un attribut mappedName équivalent dans votre client pour vous assurer que vous utilisez le bean que vous souhaitez.

+0

Premier Bean: @Stateless (name = "SecurityService", mappedName = "SecurityService") public class SecurityServiceBean implémente SecurityServiceLocal { } Second Bean: @Stateless (name = "SecurityServiceEnha", mappedName = "SecurityServiceEnha") public class SecurityServiceEnhaBean implémente SecurityServiceLocal { } – Pokuri

+0

Merci KeithL pour vos conseils – Pokuri

Questions connexes