EJBのJNDI lookupでNameNotFoundException
■問題点
その名の通りJNDI lookupでEJBが見付からなくってNameNotFoundExceptionが発生。
環境:WebLogic 11g Release 1
■背景等
EJB 3だと以下のようにアノテーションを使ってEJBを呼び出すから、通常はJNDIルックアップとか必要ない。
// ビジネスロジックのインターフェース @Local public interface SomeInterface { public void doSomething(); } // ビジネスロジックの実装 @Stateless public class SomeBean implements SomeInterface { public void doSomething() { // 処理 } } // Session Bean を使うクラス public class Client { // DI @EJB private SomeInterface foo; }
今回は扱う業務データのファイルの種類毎にSession Beanがあって、Sessioin Beanの名前を動的に生成して使うようにしているので。
※ビジネスロジックをPOJOにして、呼び出されるSession Beanは1つにし、リフレクションでビジネスロジックのクラスを呼び出すという方法でも良いのかもしれないけど…いやー、この辺はよく分からん。
■調査
まずはJNDI名がどうなるかを確認する。このページの「APサーバー毎の違い」が非常に参考になった。(実装のクラスとインターフェースを混同しない事)
で、その名前でlookupしてみても、NameNotFoundException ・・・。そのJNDI名でWebLogicにちゃんと登録されているかどうかを確認する手段がある事を知った。
管理コンソールの環境 → サーバー・・・詳しくは先ほどのHishidamaさんのこちらのページ。
で、調べてみると登録されていない!
■解決方法?
@Remoteを実装しないとダメっぽい。EJBを深く理解していないので、この辺はもう少し勉強する。とりあえずやったことは先ほどのインターフェースのコードを以下のように変更した。
@Local @Remote // 追加 public interface SomeInterface { public void doSomething(); }
これで一応動くようになった。