2

Java EE クライアント アプリケーションから EJB3 にアクセスしようとしていますが、ルックアップの失敗しか得られません。クライアント アプリケーションは、Java EE Application Client Container 内で実行されています。

私の 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 名とまったく同じです (InitialContext ではなく SessionContext を介して - それは重要ですか?)。また、「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]

4 つの名前すべてを試しましたが、どれも機能しませんでした。appclient はリモート インターフェイス (のみ) を持つ Bean にアクセスできませんか?

4

3 に答える 3

1

java:global/CoreServer/CampaignControllerの代わりにjava:global /CoreServer/CampaignController!mvs.api.CampaignControllerRemoteを試しましたか?

于 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 に答える