7

次のように定義された EJB があります。

package com.foo;
@Stateless (mappedName="HelloWorld")
public class HelloWorldBean implements HelloWorld, HelloWorldLocal
....

Weblogic (WL) にデプロイされると、myBean という名前が付けられます。これが重要かどうかはわかりません。

このコードで Bean を呼び出そうとします:

Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
ic = new InitialContext(ht);
tp = (HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorldBean");

次のエラーが発生する理由を知っている人はいますか?

javax.naming.NameNotFoundException: While trying to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find subcontext 'HelloWorld#com'.
 Resolved '' [Root exception is javax.naming.NameNotFoundException: While trying
 to lookup 'HelloWorld#com.foo.HelloWorldBean' didn't find
 subcontext 'HelloWorld#com'. Resolved '']; remaining name 'HelloWorld#com/foo/HelloWorldBean'
4

1 に答える 1

10

com.acme.FooBusiness1複数のリモート ビジネス インターフェース (など)を持つセッション Bean のリモート インターフェースをルックアップするには、ターゲット ejb のグローバル JNDI 名 (内の) と特定のリモート ビジネス インターフェースcom.acme.FooBusiness2の組み合わせから派生した名前をルックアップする必要があります。 "#":mappedName()@Stateless

InitialContext ic = new InitialContext();
FooBusiness1 bean1 = (FooBusiness1) ic.lookup("FooEJB#com.acme.FooBusiness1");
FooBusiness2 bean2 = (FooBusiness2) ic.lookup("FooEJB#com.acme.FooBusiness2");

1 つのリモート ビジネス インターフェイスしか持たない Bean の典型的なケースでは、この完全修飾形式は必要ありません。その場合、Bean の JNDI 名を直接使用できます。

FooBusiness bean = (FooBusiness) ic.lookup("FooEJB");

それが理論的な部分でした。今練習。あなたの場合、私が見る限り、あなたは Weblogic から EJB にアクセスしているので、引数なしのInitialContext()コンストラクターを使用したいと思います (そしてjndi.properties、他の環境では構成ファイルを使用します) が、これは単なる補足事項です。次に、実装com.foo.HelloWorldではなく、リモート インターフェイスを検索する必要があります。com.foo.HelloWorldBean

InitialContext ic = new InitialContext();
(HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorld");

また、Bean にリモート ビジネス インターフェイスが 1 つしかない場合は、次のように動作します。

(HelloWorld) ic.lookup("HelloWorld");
于 2009-10-24T17:27:03.187 に答える