質問

次のように定義された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'
役に立ちましたか?

解決

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

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にアクセスしているので、no-arg InitialContext()コンストラクタを使用します(そして jndi.properties 構成ファイル(他の環境用)ですが、これは単なる補足です。次に、 com.foo.HelloWorldBean ではなく、リモートインターフェイスである com.foo.HelloWorld を検索する必要があります。

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

また、Beanにリモートビジネスインターフェイスが1つしかない場合、これは機能するはずです:

(HelloWorld) ic.lookup("HelloWorld");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top