【问题标题】:EJB3 JNDI Lookup Failure in Java EE application clientJava EE 应用程序客户端中的 EJB3 JNDI 查找失败
【发布时间】:2010-04-29 13:03:06
【问题描述】:

我正在尝试从 Java EE 客户端应用程序访问 EJB3,但除了查找失败之外什么都没有。客户端应用程序在 Java EE 应用程序客户端容器中运行。

我的 Java EE 应用程序“CoreServer”公开了许多具有远程接口的 bean。我从部署在同一个 Glassfish v3.0.1 上的 Web 应用程序访问它们没有问题。

现在我正在尝试从客户端应用程序访问它:

public class Main {

  public static void main(String[] args) {
    CampaignControllerRemote bean = null;

    try {
        InitialContext ctx = new InitialContext();
        bean = (CampaignControllerRemote) ctx.lookup("java:global/CoreServer/CampaignController");

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if (bean != null) {
        Campaign campaign = bean.get(361);
        if (campaign != null) {
            System.out.println("Got "+ campaign);
        }
    }
  }

}

当我运行将它部署到 Glassfish 并从 appclient 运行它时,我收到此错误:

Lookup failed for 'java:global/CoreServer/CampaignController' in SerialContext targetHost=localhost,targetPort=3700,orb'sInitialHost=localhost,orb'sInitialPort=3700

但是,这与我从 WebApplication 查找 bean 时使用的 JNDI 名称完全相同(通过 SessionContext,而不是 InitialContext - 这有关系吗?)。此外,当我部署“CoreServer”时,Glassfish 报告:

Portable JNDI names for EJB CampaignController : [java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote, java:global/CoreServer/CampaignController]
Glassfish-specific (Non-portable) JNDI names for EJB CampaignController : [mvs.api.CampaignControllerRemote, mvs.api.CampaignControllerRemote#mvs.api.CampaignControllerRemote]

我尝试了所有四个名称,但没有一个有效。 appclient 是否无法通过(仅)远程接口访问 bean?

【问题讨论】:

  • 我建议您切换到对两个用例都使用依赖注入...(您的 Web 应用程序和应用程序客户端)。
  • 如何通过应用客户端上的依赖注入完成 CORBA 查找?你能说得更具体点吗?

标签: jakarta-ee glassfish ejb-3.0 glassfish-3 application-client


【解决方案1】:

如果您谈论的是应用程序客户端,请使用以下答案:

不要为 jndi 查找而烦恼;您可以将@EJB 注入到应用程序类的static 字段中。

【讨论】:

    【解决方案2】:

    您是否尝试过 java:global/CoreServer/CampaignController!mvs.api.CampaignControllerRemote 而不是 java:global/CoreServer/CampaignController

    【讨论】:

      【解决方案3】:

      如果您谈论的是独立客户端,请使用以下答案:

      这是我用于 glassfish v2 的 JNDI 查找的方法,它可能与 v3 非常相似:

      private void lookupJndi() {
          final Properties props = new Properties();
          props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory");
          String host = "hostname.domain";
          logger.log(Level.INFO, "Connecting to CORBA Host: " + host);
          props.setProperty("org.omg.CORBA.ORBInitialHost", host);
          try {
              InitialContext ic = new InitialContext(props);
              scheduleManager = (ScheduleManagerRemote) ic.lookup("ScheduleManagerRemote");
              experimentManager = (ExperimentManagerRemote) ic.lookup("ExperimentManager");
              facilityManager = (FacilityManagerRemote) ic.lookup("FacilityManager");
          } catch (NamingException e) {
              ...
          }
      

      关键部分是获取 com.sun INITIAL_CONTEXT_FACTORY。还要确保您的应用程序捆绑了所有 glassfish 依赖项。对于 glassfish v2,有很多。 v2 jar 是:javaee、appserv-rt、appserv-ext、appserv-admin、appserv-deployment-client。

      使用 v3 可能会简单得多,但这绝对适用于 v2.x

      【讨论】:

      • 正在捆绑与使用appclient不同的所有依赖项?
      • @Thufir 自从我看到这个已经 long 时间了,但是 IIRC 与独立客户端相比,appclient 的区别在于 appclient 是一个托管容器,您的对象实例被注入。如果两个用例不同,则关联的一组依赖项。
      猜你喜欢
      • 2020-01-03
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多