Weblogic 10.3でEJBを呼び出すときのNameNotFoundException
-
06-07-2019 - |
質問
次のように定義された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 を使用します) code>構成ファイル(他の環境用)ですが、これは単なる補足です。次に、
com.foo.HelloWorldBean
ではなく、リモートインターフェイスである com.foo.HelloWorld
を検索する必要があります。
InitialContext ic = new InitialContext();
(HelloWorld) ic.lookup("HelloWorld#com.foo.HelloWorld");
また、Beanにリモートビジネスインターフェイスが1つしかない場合、これは機能するはずです:
(HelloWorld) ic.lookup("HelloWorld");
所属していません StackOverflow