未知的JNDI查找字符串

时间:2015-05-29 15:03:07

标签: ejb ejb-3.0 jndi ejb-3.1 ejb-2.x

我是EJB概念的新手。我在不同的网站上看过以下内容:

样本1:

@Stateless
@EJB(name="audit", beanInterface=AnotherEJBLocal.class)
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
  @PersistenceContext(unitName = "EmployeeService")
  private EntityManager manager;

  public void doAction(){
    try {
      Context ctx = new InitialContext();
      AnotherEJBLocal audit = (AnotherEJBLocal) ctx.lookup("java:comp/env/audit");
      audit.doAnother();
  } catch (NamingException e) {
      throw new EJBException(e);
  }

  }
}

样本2:

public static void main(String[] a) throws Exception {

    EmployeeServiceRemote service = null;
    service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeBean/remote");


    service.doAction();



  }

样本3:

obj = ctx.lookup(ejb/CBDWebAppEAR/CBDWebApp.jar/<EJB name>/<Remote Interface Class Name>);

CBDWebApp是bean所在的项目名称。

我的问题是:

  1. 有什么需要&amp; java的含义:comp / env / audit

  2. 为什么在样本2的情况下不使用相同类型的字符串。我猜是 它是一个远程EJB而不是本地的。

  3. 为什么EJB的含义在示例3中查找字符串。

1 个答案:

答案 0 :(得分:0)

  1. java:comp/env/audit字符串正在查找@EJB(name="audit", beanInterface=AnotherEJBLocal.class)之前声明的EJB引用。 @EJB(以及@Resource和所有其他EE引用)声明的名称在java:comp/env上下文中隐式声明。通过此参考,部署人员可以重新调整&#34;审计&#34;引用实现AnotherEJBLocal接口的应用程序中的任何EJB,或者如果部署者没有指定任何内容,则@EJB批注的javadoc要求它在实现接口的同一应用程序中定位单个EJB。

  2. 这个主要方法(可能)由独立的Java程序声明。在这种情况下,它(可能)通过系统属性进行配置,以连接应用程序服务器的JNDI服务器,该服务器将远程引用返回给客户端。查找的名称是特定于供应商的,并且可能是在部署期间为EJB配置的。

  3. 这与#2非常相似,唯一的区别是正在使用的特定字符串。在这种情况下,它可能依赖于应用程序服务器&#34;默认&#34;绑定名称(如果在部署期间未使用模式ejb/<app>/<module>/<bean>/<interface>为EJB配置。