Java ee 6: javax.die Benennung.NameAlreadyBoundException: Verwenden Sie danach das System neu binden zu überschreiben
Habe ich ein business-interface wird implementiert, indem zwei EJBs.
UserManagementService
@Remote
public interface UserManagementService {
//...
}
UserManagementServiceJpaImpl
@Stateless(name="userManagementServiceJpaImpl")
public class UserManagementServiceJpaImpl implements UserManagementService {
@EJB(beanName="userManagementDaoJpaImpl")
private UserManagementDao userManagementDao;
//...
}
UserManagementServiceMockImpl
@Stateless(name="userManagementServiceMockImpl")
public class UserManagementServiceMockImpl implements UserManagementService {
@EJB(beanName="userManagementDaoMockImpl")
private UserManagementDao userManagementDao;
//...
}
Wenn ich die Anwendung bereitstellen zu Glassfish 3.1 bekomme ich die folgende Fehlermeldung:
java.lang.RuntimeException: Error while binding JNDI name com.transbinary.imdb.service.UserManagementService for EJB : userManagementServiceMockImpl
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1550)
at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:202)
at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:167)
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234)
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:290)
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:101)
at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:249)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:360)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1247)
at org.glassfish.deployment.autodeploy.AutoOperation.run(AutoOperation.java:145)
at org.glassfish.deployment.autodeploy.AutoDeployer.deploy(AutoDeployer.java:577)
at org.glassfish.deployment.autodeploy.AutoDeployer.deployAll(AutoDeployer.java:463)
at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:395)
at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:380)
at org.glassfish.deployment.autodeploy.AutoDeployService$1.run(AutoDeployService.java:213)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Caused by: javax.naming.NameAlreadyBoundException: Use rebind to override
at com.sun.enterprise.naming.impl.TransientContext.doBindOrRebind(TransientContext.java:333)
at com.sun.enterprise.naming.impl.TransientContext.bind(TransientContext.java:268)
at com.sun.enterprise.naming.impl.SerialContextProviderImpl.bind(SerialContextProviderImpl.java:98)
at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.bind(LocalSerialContextProviderImpl.java:99)
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:672)
at com.sun.enterprise.naming.impl.SerialContext.bind(SerialContext.java:689)
at javax.naming.InitialContext.bind(InitialContext.java:404)
at javax.naming.InitialContext.bind(InitialContext.java:404)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:208)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.publishObject(GlassfishNamingManagerImpl.java:189)
at com.sun.ejb.containers.BaseContainer$JndiInfo.publish(BaseContainer.java:5608)
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1535)
... 23 more
Könnte mir jemand helfen zu verstehen warum ich immer diese Fehlermeldung und wie es zu lösen?
- Versuchen Sie suchen in server-Start-Protokolle, wo die JNDI-Bindung der Schnittstellen angezeigt werden, prüfen Sie, ob Ihr bereits auf dem server bereitgestellt. Wahrscheinlich dieser Fehler tritt mit demselben interface-Namen in verschiedenen Paketen oder einschließlich derselben Schnittstelle in mehrere Gläser.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig GlassFish-Server-spezifischen default-JNDI-Namen, die automatisch angewendet werden für die Abwärtskompatibilität. So
com.transbinary.imdb.service.UserManagementService
ist das die default-JNDI-Namen für die Implementierungen vonUserManagementService
- Schnittstelle. Was war, warum war ich getttingjavax.naming.NameAlreadyBoundException
Ausnahme.Da aber der EJB-3.1-Spezifikation definiert portable EJB JNDI-Namen, gibt es weniger Bedarf für GlassFish Server bestimmten JNDI-Namen.
Deaktivieren GlassFish Server bestimmten JNDI-Namen für ein EJB-Modul, setzen Sie den Wert
disable-nonportable-jndi-names
elementtrue
. Der Standardwert istfalse
.Es das problem gelöst.
Ressource: http://wikis.oracle.com/display/GlassFish/Developer+Handoff+to+QA+for+EJB-8+%28Option+to+disable+GlassFish-specific+JNDI%29
GlassFish neu starten. (Es funktionierte für mich.)
Ich habe diese gleiche Ausnahme.
In meinem Fall änderte ich meinen code aus
@Stateless(mappedName = "whatever")
stattdessen werden
@Stateless(name = "whatever")
und es löste mein Problem
In meinem Fall, ich war mit JBoss5.1GA und ich hatte zwei EJBs, die die Implementierung einer gemeinsamen lokalen Business-Interface...
Folge ich der Anregung von @Christo Smal, und es funktioniert für mich.... Eine weitere Beobachtung: ich war die Bereitstellung eines Ohres, die enthält die beiden EJBs in zwei verschiedenen EJB-jars; e.g: