2011-09-16 25 views
9

Tôi có một giao diện kinh doanh đang được triển khai bởi hai EJB.JavaEE 6: javax.naming.NameAlreadyBoundException: Sử dụng rebind để ghi đè

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; 

    // ... 

} 

Khi tôi triển khai các ứng dụng để Glassfish 3.1 tôi nhận được lỗi sau:

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 

Có thể ai đó giúp tôi hiểu tại sao tôi lại nhận được lỗi này và làm thế nào để giải quyết nó?

+0

Hãy thử xem nhật ký khởi động của máy chủ nơi JNDI ràng buộc giao diện được hiển thị, kiểm tra xem nó đã được triển khai trên máy chủ chưa. Hầu hết có thể lỗi này phát sinh có cùng tên giao diện trong các gói khác nhau hoặc bao gồm cùng một giao diện trong nhiều lọ. –

Trả lời

9

Theo mặc định, các tên JNDI mặc định của máy chủ GlassFish được áp dụng tự động cho khả năng tương thích ngược. Vì vậy, com.transbinary.imdb.service.UserManagementService là tên JNDI mặc định cho cả hai triển khai của giao diện UserManagementService. Đó là lý do tại sao tôi đã gettting javax.naming.NameAlreadyBoundException ngoại lệ.

Nhưng vì đặc tả EJB 3.1 xác định tên EJB JNDI di động nên cần có ít tên JNDI của máy chủ GlassFish hơn.

Để tắt tên JNDI của máy chủ GlassFish cụ thể cho mô-đun EJB, hãy đặt giá trị thành phần disable-nonportable-jndi-names thành true. Giá trị mặc định là false.

Nó giải quyết được sự cố.

Tài nguyên: http://wikis.oracle.com/display/GlassFish/Developer+Handoff+to+QA+for+EJB-8+%28Option+to+disable+GlassFish-specific+JNDI%29

7

GlassFish khởi động lại. (Nó làm việc cho tôi.)

+1

Nó cũng làm việc cho tôi, cảm ơn câu trả lời của bạn. –

+0

Cố định vấn đề của tôi quá .. buồn cười như thế nào thật sự này là .. http://www.youtube.com/watch?v=nn2FB1P_Mn8 – javatarz

+1

Điều này hoạt động trong WL 12 là tốt –

1

Tôi cũng có ngoại lệ tương tự. Trong trường hợp của tôi, tôi đã thay đổi mã của tôi từ
@Stateless(mappedName = "whatever")
để thay được
@Stateless(name = "whatever")
và nó giải quyết vấn đề của tôi

0

Trong trường hợp của tôi, tôi đã sử dụng JBoss5.1GA và tôi đã có hai EJB thực hiện một giao diện kinh doanh địa phương phổ biến ..

Tôi làm theo ý tưởng được gợi ý bởi @Christo Smal, và nó phù hợp với tôi .... Một quan sát khác: Tôi đã triển khai một tai có chứa hai EJB ở hai lọ EJB khác nhau; ví dụ:

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