2011-09-16 18 views
9

Mam interfejs biznesowy wdrażany przez dwa EJB.JavaEE 6: javax.naming.NameAlreadyBoundException: Użyj rebind, aby zastąpić

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; 

    // ... 

} 

Kiedy wdrożyć aplikację do GlassFish 3.1 pojawia się następujący błąd:

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 

Może ktoś mi pomóc zrozumieć, Dlaczego otrzymuję ten błąd i jak go rozwiązać?

+0

Spróbuj przejrzeć dzienniki uruchamiania serwera, w których są wyświetlane powiązania JNDI interfejsów, sprawdź, czy jest już wdrożony na serwerze. Najprawdopodobniej ten błąd powstaje z tego samego interfejsu nazw w różnych pakietach lub w tym samym interfejsie w wielu słoikach. –

Odpowiedz

9

Domyślnie domyślne nazwy JNDI specyficzne dla serwera GlassFish są stosowane automatycznie w celu zapewnienia kompatybilności wstecznej. Tak więc com.transbinary.imdb.service.UserManagementService jest domyślną nazwą JNDI dla obu implementacji interfejsu UserManagementService. Właśnie dlatego otrzymałem wyjątek od javax.naming.NameAlreadyBoundException.

Jednak ze względu na to, że specyfikacja EJB 3.1 definiuje przenośne nazwy JNDI EJB, istnieje mniejsze zapotrzebowanie na nazwy JNDI specyficzne dla serwera GlassFish.

Aby wyłączyć nazwy JNDI specyficzne dla serwera GlassFish dla modułu EJB, ustaw wartość elementu disable-nonportable-jndi-names na . Wartość domyślna to false.

To rozwiązało problem.

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

7

GlassFish restart. (Udało się to dla mnie.)

+1

To zadziałało również dla mnie, dzięki za odpowiedź. –

+0

Naprawiono też mój problem. Zabawne, jak to prawda. Http://www.youtube.com/watch?v=nn2FB1P_Mn8 – javatarz

+1

Działa to również w WL 12 –

1

Mam ten sam wyjątek. W moim przypadku zmieniłem kod z
@Stateless(mappedName = "whatever")
zamiast być
@Stateless(name = "whatever")
i rozwiązać mój problem

0

W moim przypadku, używałem JBoss5.1GA i miałem dwa EJB realizacji wspólnej lokalny interfejs biznesowy ..

I Postępuj zgodnie z ideą zasugerowaną przez @ Christhana Smala, i to działa dla mnie .... Kolejna obserwacja: Wstawiałem ucho, które zawiera dwa EJB w dwóch różnych słoikach EJB; np.

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