1

为什么我在使用context.lookup("java:comp/env/MyBean")时会得到 NameNotFoundException 而在使用时却没有context.lookup(MyBean.class.getName())

错误报告“No object bound for java:comp/env/MyBean”如何绑定名称,为什么class.getName()仍然有效?为什么我要使用 java:comp/env ?

我正在使用 Netbeans 6.5、Glassfish 2.1。

4

2 回答 2

2

java:comp/env前缀用于称为资源引用的东西。它是您正在查找的资源与资源的实际 JNDI 名称之间的抽象。它允许您更改底层资源的位置(即不同的服务器和上下文),而不会影响您的查找代码。

我只在 WAS 中使用过它,但想法是为需要访问资源的每个模块创建对现有资源(JMS、JDBC、EJB ...)的引用。它是您的部署配置的一部分。

来自 Sun 的教程Glassfish 示例在这里。

于 2009-03-17T12:20:08.193 回答
0

我不确定这是否适用于 Glassfish,但在 JBOSS 的情况下,如果您打开 DEBUG,您会注意到将使用的 jndi 名称。

例如,在部署名为 DemoBean 的会话 bean 期间,您将在 server.log 文件中看到以下日志:-

2009-07-24 09:08:18,747 调试 [org.jboss.ejb3.stateless.StatelessDelegateWrapper] 创建 jboss.j2ee:jar=SessionBeanDemo.jar,name=DemoBean,service=EJB3 2009-07-24 09:08:18,747 DEBUG [org.jboss.ejb3.ProxyDeployer] 没有声明远程绑定:DemoBean 2009-07-24 09:08:18,747 DEBUG [org.jboss.ejb3.ProxyDeployer] DemoBean 2009-07-24 09 有远程接口: 08:18,747 DEBUG [org.jboss.ejb3.ProxyDeployer] 默认远程绑定的 jndiName 为DemoBean/remote

然后在您的客户端代码中,您可以像这样查找它:-

        InitialContext ctx;
        try {
            ctx = new InitialContext();
            DemoBeanRemote demo = (DemoBeanRemote) ctx.lookup("DemoBean/remote");
            System.out.println(demo.sayHello());
        } catch (NamingException e) {
            e.printStackTrace();
        } 
于 2009-07-24T21:52:44.750 回答