2011-09-16 38 views
9

Tengo una interfaz de negocios implementada por dos EJB.JavaEE 6: javax.naming.NameAlreadyBoundException: Usar rebind para reemplazar

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; 

    // ... 

} 

Cuando desplegar la aplicación en GlassFish 3.1 me sale el siguiente error:

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 

Podría alguien ayudarme a entender ¿Por qué recibo este error y cómo resolverlo?

+0

Intente buscar en los registros de inicio del servidor donde se muestra el enlace JNDI de las interfaces, compruebe si ya se implementó en el servidor. Lo más probable es que surja este error al tener los mismos nombres de interfaz en diferentes paquetes o incluir la misma interfaz en varios contenedores. –

Respuesta

9

De forma predeterminada, los nombres JNDI predeterminados específicos de GlassFish Server se aplican automáticamente para compatibilidad con versiones anteriores. Por lo tanto, com.transbinary.imdb.service.UserManagementService es el nombre JNDI predeterminado para las implementaciones de la interfaz UserManagementService. Por eso estaba obteniendo la excepción javax.naming.NameAlreadyBoundException.

Pero debido a que la especificación EJB 3.1 define nombres JNDI EJB portátiles, hay menos necesidad de nombres JNDI específicos del servidor GlassFish.

Para deshabilitar los nombres JNDI específicos del servidor GlassFish para un módulo EJB, establezca el valor del elemento disable-nonportable-jndi-names en true. El valor predeterminado es false.

Resolvió el problema.

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

7

GlassFish reinicio. (Funcionó para mí.)

+1

Me funcionó, gracias por su respuesta. –

+0

Se corrigió mi problema también ... qué divertido es esto .. http://www.youtube.com/watch?v=nn2FB1P_Mn8 – javatarz

+1

Esto también funciona en WL 12 –

1

Tengo la misma excepción. En mi caso he cambiado mi código de
@Stateless(mappedName = "whatever")
ser lugar
@Stateless(name = "whatever")
y se resolvió mi problema

0

En mi caso, yo estaba usando JBoss5.1GA y que tenía dos EJB implementación de una interfaz común de negocios locales ..

I Siga la idea sugerida por @Christo Smal, y me funciona ... Otra observación: estaba desplegando una oreja que contiene los dos EJB en dos jarras EJB distintas; e.g:

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