为什么在使用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。
答案 0 :(得分:2)
java:comp / env 前缀用于称为资源引用的内容。它是您正在查找的资源与资源的实际JNDI名称之间的抽象。它允许您更改底层资源的位置(即不同的服务器和上下文),而不会影响您的查找代码。
我只在WAS中使用它,但想法是为每个需要访问资源的模块创建对现有资源(JMS,JDBC,EJB ...)的引用。它是部署配置的一部分。
答案 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();
}