2

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

3 回答 3

1

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

于 2010-05-19T07:35:44.060 回答
1

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

不要为 jndi 查找而烦恼;您可以在应用程序类的静态字段中使用@EJB 注入。

于 2010-05-19T04:51:38.780 回答
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 jar 是:javaee、appserv-rt、appserv-ext、appserv-admin、appserv-deployment-client。

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

于 2010-05-19T04:36:06.650 回答