Java EE应用程序客户端中的EJB3 JNDI查找失败

时间:2010-04-29 13:03:07

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

我正在尝试从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?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

这是我用于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罐子是:javaee,appserv-rt,appserv-ext,appserv-admin,appserv-deployment-client。

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

答案 3 :(得分:0)