java - 使用 JNDI 的 NameAlreadyBoundException

标签 java weblogic jndi jdeveloper

我使用以下代码创建了一个 session bean:

package ejb2;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

@Stateless(name = "TestEJB", mappedName = "EJB2-Project1-TestEJB")
public class TestEJBBean implements TestEJB, TestEJBLocal {
    @Resource
    SessionContext sessionContext;

    public TestEJBBean() {
    }

    public String getHello(String who_welcome) {
        return "Hello " + who_welcome;
    }
}

正如你所看到的,这几乎是一个默认代码(除了 getHello 方法)。除了这个 bean 我还有一个客户:

package ejb2;

import java.util.Hashtable;

import javax.naming.CommunicationException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class TestEJBClient {
    public static void main(String[] args) {
        try {
            final Context context = getInitialContext();
            TestEJB testEJB = (TestEJB) context.lookup("EJB2-Project1-TestEJB#ejb2.TestEJB");
            System.out.println(testEJB.getHello("Student"));
        } catch (CommunicationException ex) {
            System.out.println(ex.getClass().getName());
            System.out.println(ex.getRootCause().getLocalizedMessage());
            System.out.println("\n*** A CommunicationException was raised.  This typically\n*** occurs when the target WebLogic server is not running.\n");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static Context getInitialContext() throws NamingException {
        Hashtable env = new Hashtable();
        // WebLogic Server 10.x/12.x connection details
        env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        env.put(Context.PROVIDER_URL, "t3://localhost:7101");
        return new InitialContext(env);
    }
}

第一次它就像一个魅力。但后来我创建了另一个 bean:

package ejb2;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;

@Stateless(name = "ClientEJB", mappedName = "EJB2-Project1-ClientEJB")
public class ClientEJBBean implements ClientEJB, ClientEJBLocal {
    @Resource
    SessionContext sessionContext;
    TestEJB testEJB;

    public ClientEJBBean() {
        try {
            final Context context = new InitialContext();
            testEJB = (TestEJB) context.lookup("EJB2-Project1-TestEJB#ejb2.TestEJB");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public String getHelloFromBean(String who) {
        return testEJB.getHello(who);
    }
}

现在 Bean 不起作用了。我收到这样的错误:

weblogic.application.ModuleException:无法将业务接口(interface)绑定(bind)到 JNDI 名称:EJB2Project1WebApp_warClientEJB_Home,引发异常 javax.naming.NameAlreadyBoundException:[EJB:011224]无法将接口(interface) ejb2.ClientEJB 绑定(bind)到 ClientEJB。另一个 EJB 已将接口(interface)绑定(bind)到该名称。剩余名称“EJB2-Project1-ClientEJB#ejb2”。 NestedException 消息是:[EJB:011224]无法将接口(interface) ejb2.ClientEJB 绑定(bind)到 ClientEJB。另一个 EJB 已将接口(interface)绑定(bind)到该名称。

这些代码有什么问题?

最佳答案

据我所知,您尝试部署两个具有相同 JNDI 名称的无状态 EJB 尝试取消部署当前应用程序,从管理控制台检查 JNDI 树 并确保该树没有您认为重复的 JNDI 名称。

关于java - 使用 JNDI 的 NameAlreadyBoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33153473/

相关文章:

java - 使用 Ghost4j 示例代码删除 Java Temp 文件时出错

java - SourceDataLine.start() 将对象清空

java - 如何在WebLogic Workshop中创建支持JPA实体bean的项目?

java.lang.InternalError : name is too long to represent

java - Weblogic 12c : Unable to add security token for identity, 但独立工作

java - 将现有 JNDI HornetQ 服务设为 HA 的步骤?

java - 在 JNDI 中存储属性?环境特定位置

java - io.iron.ironmq.HTTPException : Not found (IronMQ JAVA)

java - JSF 显示 p :dialog if a parameter is true

java - 获取 EntityManagerFactory 的最佳实践