JavaEE 6: javax.naming.NameAlreadyBoundException: использовать перепривязку для переопределения - PullRequest
11 голосов
/ 16 сентября 2011

У меня есть бизнес-интерфейс, реализуемый двумя EJB.

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;

    // ...

}

При развертывании приложения в Glassfish 3.1 появляется следующая ошибка:

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

Может ли кто-нибудь помочь мне понять, почему я получаюэта ошибка и как ее устранить?

Ответы [ 4 ]

9 голосов
/ 17 сентября 2011

По умолчанию имена JNDI по умолчанию для сервера GlassFish применяются автоматически для обратной совместимости.Таким образом, com.transbinary.imdb.service.UserManagementService является именем JNDI по умолчанию для обеих реализаций интерфейса UserManagementService.Именно поэтому я получал javax.naming.NameAlreadyBoundException исключение.

Но поскольку спецификация EJB 3.1 определяет переносимые имена JNDI EJB, меньше необходимости в именах JNDI, специфичных для GlassFish Server.

Чтобы отключить имена JNDI, специфичные для сервера GlassFish, для модуля EJB, задайте для элемента disable-nonportable-jndi-names значение true.По умолчанию false.

. Решена проблема.

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

8 голосов
/ 22 апреля 2013

перезапуск GlassFish. (Это сработало для меня.)

1 голос
/ 28 июня 2013

Я получил это же исключение. В моем случае я изменил свой код с
@Stateless(mappedName = "whatever")
на вместо
@Stateless(name = "whatever")
, и это решило мою проблему

0 голосов
/ 12 февраля 2014

В моем случае я использовал JBoss5.1GA, и у меня было два EJB-компонента, реализующих общий локальный бизнес-интерфейс ...

Я следую идее, предложенной @Christo Smal, и она работает для меня ... Еще одно замечание: я развертывал ухо, которое содержит два EJB на двух разных банках EJB; например:

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