2011-09-16 14 views
9

Ho un'interfaccia aziendale implementata da due EJB.JavaEE 6: javax.naming.NameAlreadyBoundException: utilizzare rebind per eseguire l'override

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; 

    // ... 

} 

Quando schiero l'applicazione su GlassFish 3.1 ottengo il seguente errore:

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 

Qualcuno potrebbe aiutarmi a capire Perché mi appare questo errore e come risolverlo?

+0

Provare a esaminare i log di avvio del server in cui viene mostrato il binding JNDI delle interfacce, verificare se è già distribuito sul server. Molto probabilmente questo errore si presenta con gli stessi nomi di interfaccia in pacchetti diversi o includendo la stessa interfaccia in più jar. –

risposta

9

Per impostazione predefinita, i nomi JNDI predefiniti di GlassFish Server vengono applicati automaticamente per la compatibilità con le versioni precedenti. Quindi com.transbinary.imdb.service.UserManagementService è il nome JNDI predefinito per entrambe le implementazioni dell'interfaccia UserManagementService. Il motivo per cui stavo ottenendo l'eccezione javax.naming.NameAlreadyBoundException.

Ma poiché la specifica EJB 3.1 definisce i nomi JNDI EJB portatili, è necessario meno nomi JNDI specifici per GlassFish Server.

Per disabilitare i nomi JNDI specifici di GlassFish Server per un modulo EJB, impostare il valore dell'elemento disable-nonportable-jndi-names su true. L'impostazione predefinita è false.

Ha risolto il problema.

risorse: http://wikis.oracle.com/display/GlassFish/Developer+Handoff+to+QA+for+EJB-8+%28Option+to+disable+GlassFish-specific+JNDI%29

7

GlassFish riavvio. (Ha funzionato per me.)

+1

Ha funzionato anche per me, grazie per la tua risposta. –

+0

Risolto il problema anche io .. divertente come è vero .. http://www.youtube.com/watch?v=nn2FB1P_Mn8 – javatarz

+1

Funziona anche in WL 12 –

1

Ho ottenuto la stessa eccezione. Nel mio caso ho cambiato il mio codice da
@Stateless(mappedName = "whatever")
essere invece
@Stateless(name = "whatever")
e risolto il mio problema

0

Nel mio caso, stavo usando JBoss5.1GA e ho avuto due EJB l'attuazione di una comune interfaccia di business locale ..

I Seguo l'idea suggerita da @Christo Smal, e funziona per me .... Un'altra osservazione: stavo distribuendo un orecchio che contiene i due EJB in due diversi vasi EJB; ad esempio:

Ear File: 
    * Jar File1: Containing EJB1 
    * Jar File2: Containing EJB2 
    * lib/dummy.jar: Library containing the Business Local interface 
Problemi correlati