为什么在使用context.lookup(“java:comp / env / MyBean”)时会得到NameNotFoundExcpetion

时间:2009-03-17 12:14:55

标签: java java-ee ejb

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

错误报告“没有绑定到java的对象:comp / env / MyBean”如何绑定名称以及为什么class.getName()仍然有效?我为什么要使用java:comp / env?

我正在使用Netbeans 6.5,Glassfish 2.1。

2 个答案:

答案 0 :(得分:2)

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

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

Tutorial from Sun hereGlassfish example here.

答案 1 :(得分:0)

我不确定Glassfish是否属实,但对于JBOSS,如果打开DEBUG,您可以注意到将使用的jndi名称。

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

2009-07-24 09:08:18,747 DEBUG [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();
        }