2010-04-29 63 views
2

我试图从Java EE客户机应用程序访问EJB3,但一直只能查找失败。客户端应用程序在Java EE应用程序客户端容器中运行。Java EE应用程序客户机中的EJB3 JNDI查找失败

我的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(通过SessionContext,而不是InitialContext - 这很重要吗?)时,我使用的是完全相同的JNDI名称。另外,当我部署'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?

+0

我会建议您切换到使用依赖注入两个用例...(你的web应用程序和应用程序客户端)。 – vkraemer 2010-05-12 05:13:38

+0

在应用程序客户机上依靠注入完成CORBA查找是如何完成的?你可以说得更详细点吗? – Thufir 2015-03-11 15:43:10

回答

0

如果你是在谈论一个独立的客户端,使用这样的回答:

下面是我使用JNDI查找GlassFish v2中的方法,它可能是非常相似的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

+0

捆绑了所有与使用'appclient'不同的依赖关系? – Thufir 2015-03-11 15:44:49

+1

@Thufir自从我看了这个以来,这已经很长时间了,但是与独立客户端相比,IIRC与appclient的区别在于appclient是一个托管容器,您的对象实例将被注入。如果两个用例不同,则相关联的一组依赖关系。 – 2015-03-11 16:31:03

1

如果你谈论的是一个应用程序客户端使用这样的回答:

不要JNDI查找麻烦;您可以使用@EJB注入到应用程序类的静态字段中。

1

你试过的java:全球/ CoreServer/CampaignController mvs.api.CampaignControllerRemote,而不是的java:全球/ CoreServer/CampaignController