我是EJB 3.1世界的新手,并试图通过JBoss Application Server 7.1获得一些基础知识。
目前我陷入了一个非常基本的问题。当服务器上的bean想要使用另一个bean时,我需要使用InitialContext.lookup()方法。如果我查看文献,我会发现如下呼叫:
TheBean = (<Interface>) new InitialContext().lookup("<NameOfTheBean>/local");
但这个电话对我不起作用。每次我收到这样的错误:
javax.ejb.EJBException: javax.naming.NameNotFoundException
在寻找解决方案几个小时之后,我找到了使用另一个调用的代码示例,如下所示:
TheBean = (<Interface>) new InitialContext().lookup("ejb:/<Package>//<NameOfTheBean>!<Package>.<Interface>");
这个解决方案对我有用,但问题是为什么?有人知道为什么第一个调用产生异常而第二个调用正常吗?
非常感谢!
答案 0 :(得分:2)
为什么呢?不同版本的JBoss在JNDI名称空间中部署具有不同默认名称的bean。
ctx.lookup("BeanName/local")
适用于JBoss 4.x.x及更高版本但不适用于JBoss v7。 您可以在JB7的server.log中看到您的bean如何映射到JNDI名称, 例如(参见java:/ jboss / exported / ...以及它与你的第二次连续调用的对应关系):
13:57:05,550 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-4) JNDI bindings for session bean named ProductionHistoryBean in deployment unit deployment "navi-ejb3.jar" are as follows: java:global/navi-ejb3/ProductionHistoryBean!navi.ejb3.production.history .ProductionHistoryRemote java:app/navi-ejb3/ProductionHistoryBean!navi.ejb3.production.history.Pr oductionHistoryRemote java:module/ProductionHistoryBean!navi.ejb3.production.history.Productio nHistoryRemote java:jboss/exported/navi-ejb3/ProductionHistoryBean!navi.ejb3.production .history.ProductionHistoryRemote java:global/navi-ejb3/ProductionHistoryBean java:app/navi-ejb3/ProductionHistoryBean java:module/ProductionHistoryBean