Editionをインストールする。Studioで開発するJ2EEコンテナであるJBossを使ってEJBの勉強をしてみました。sayHello()メソッドでStringを返却するEJBを作る場合以下の物が必要です。このようにすることによって、ビジネスロジックがどこで実行されたかを気にしないで結果を得ることができるようになります。可用性が向上するわけですね。†さて、先ほどJNDI経由でHomeインタフェースを取得すると言いましたが、EJBではオブジェクトを取得する際、必ずInitialContext?を経由します。この機構をJNDIといいます。InitialContext?はあらかじめ、Stringのキー値とオブジェクトを対にしてコンテナに登録しておき、そのキー値でオブジェクトを検索し取得するのですが、そのキー値とオブジェクトの関係を理解しないと相当ややこしいです。登録されているオブジェクトです。話を整理すると、コンテナには、HelloEJBHogeというキーで、hello.HelloHome?オブジェクトが登録されている。InitialContext?をそのキー値でlookupすることで、hello.HelloHome?オブジェクトを取得するということです。そこでそもそもコンテナにオブジェクトを登録する方法は?、もっと具体的にいうとInitialContext?をlookupする際のキー"HelloEJBHoge"と、hello.HelloHome?オブジェクトはどうやって関連づけられるのでしょうか??という疑問がわき起こります。†さて先の疑問を解決したいと思います。hello.HelloHome?に名前を付けます。これはJ2EEの仕様内であるejb-jar.xmlによって行われます。</enterprise-beans></ejb-jar>これで、hello.HelloHome?にはHelloEJBというEJB名が付けられました。このEJB名"HelloEJB"とコンテナ側に登録されている"HelloEJBHoge"は、JBoss独自ファイルである、jboss.xmlで関連づけられます。</enterprise-beans></jboss>これでHelloEJBHogeというキーとhello.HelloHome?が関連づけられました。これらのクラスファイルやDDファイルをコンテナにデプロイすることで、JNDIへの登録から何からが完了したことになります。ちなみにejb-jar.xmlとjboss.xmlはejbのjarの/META-INF内に配置します。これで、HelloEJBHogeでlookupすればhello.HelloHome?を取得できそうです。}}これで確かに稼動しました!。ちなみにEclipseから実行したときは、実行時のクラスパスに${JBOSS_HOME}/client/jbossall-client.jarにパスを通さないとダメみたい。Source)なんてエラーが表示されしまうかも。†さて、いわゆるローカルな(?)Lookupはこれで良さそうですが、サーブレットなどからEJBにアクセスするためにはjava:comp/envを使ったENCによるJNDI検索をする必要があるみたいです。InitialContext?をlookupするときにcontext.lookup("java:comp/env/ejb/HelloEJB");てやる例のヤツです。web.xmlには以下のEJB参照を記述しました。</ejb-ref>これで、ejb-linkのところでjboss.xmlのejb-nameを見に行って、そこのjndi-nameでlookupする、と理解したんだけど、うまくいかない。以下のエラーが表示されてしまいます。jboss-web.xml)なんていわれるから、DDたちはあってるような気がする。context.lookup("HelloEJBHoge");とやっても、ENCでやったときと同じエラーが出ちゃいます。2005/11/22追記どうも、EARファイルへのパッケージングのやり方が悪かったみたいです。WARファイルの中にEJBのファイルも入れてたんだけど、それがNGのようです。WARはWEBコンテナにデプロイしたいもののみ、EJB-JARはEJBコンテナにデプロイしたいもののみを入れなくてはいけないようです。jboss.xmlのejb-nameによるJNDI名との関連づけだけではなく、jboss-web.xmlによる関連づけも可能です。<jndi-name>HelloEJBHoge</jndi-name></ejb-ref>と書くだけのようです。こっちの方が、きれいですね。ちなみにjboss-web.xmlはwarのWEB-INF/直下に配置します。web.xmlの隣に置いておきましょう。「JBossでは」というよりも、同じEARに入れられたEJBを参照するときは<ejb-link>で、外部のEJBを参照するときはjboss-web.xmlで関連づける、という決まりになってるみたいですね。ココには非常に詳しくjboss-web.xmlなどの設定が書いてあります。Developerで動かしたらうごいたぞー。検索してみたところ、クラスローダがどうのとか、ようするにパッケージングに問題がありそうな感じ。