2010-04-29 44 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