- PR -

Xdocletで自動生成したソースがそのままだと名前解決に失敗しlookupできない。

1
投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-19 12:56
JBOSS-IDE の v1.4.0 を使い内包するXdoclet でセッションビーンからEJBを自動生成しました。
そのときに指定したセッションビーンでのXdocletのタグの指定は

/**
* @ejb.bean name="FecEntrance"
* display-name="Name for FecEntrance"
* description="Description for FecEntrance"
* jndi-name="ejb/FecEntrance"
* type="Stateless"
* view-type="remote"
*/


FecEntrance.java
FecEntranceHome.java
FecEntranceSession.java
FecEntranceUtil.java
が新規に作成されました。


生成されたHOMEインターフェースのプロパティには
public static final String COMP_NAME="java:comp/env/ejb/FecEntrance";
public static final String JNDI_NAME="ejb/FecEntrance";
ができている状態です。
今回の話題はこのCOMP_NAMEなのですが、自動生成されたファイルは編集禁止と銘打ったありますが、このままだと
javax.naming.NameNotFoundException: ejb not bound
が発生してしまいます。これを何とかしたいのです。。。

ひとつの解決策として
COMP_NAMEの値をJNDI_NAMEと同じにすると回避されましたが、これは気が進みません。
理由は毎回EJBを作成するたびにこの部分を修正しなければならず、ソースの本数を考えると手間だからです。
設定が悪いのか、JBOSS-IDEのバグなのか分からないのですが、(COMP_NAMEは生成されたUtilクラスが使用しています)

Xdocletを走らせると自動生成されるコンフィグファイルがあります。
META-INFに
ejb-jar.xml
jboss.xml
が生成されるのですが、ここらへんにJNDIの設定箇所があります。

jboss.xmlには
<session>
<ejb-name>FecEntrance</ejb-name>
<jndi-name>ejb/FecEntrance</jndi-name>

</session>
とあり、これを
<jndi-name>java:comp/env/ejb/FecEntrance</jndi-name>
に変えるなどして試してみたのですが、結果は同じでした。(javax.naming.NameNotFoundException: ejb not boundが出る)
新たに
<comp-name>java:comp/env/ejb/FecEntrance</comp-name>
などを追加してみてもだめでした。
どなたか解決策を知っておられる方おられませんでしょうか。
よろしくお願いいたします。

エラーログ:
12:25:50,317 INFO [STDOUT] javax.naming.NameNotFoundException: ejb not bound
12:25:50,317 INFO [STDOUT] at org.jnp.server.NamingServer.getBinding(NamingServer.java:495)
12:25:50,317 INFO [STDOUT] at org.jnp.server.NamingServer.getBinding(NamingServer.java:503)
12:25:50,317 INFO [STDOUT] at org.jnp.server.NamingServer.getObject(NamingServer.java:509)
12:25:50,317 INFO [STDOUT] at org.jnp.server.NamingServer.lookup(NamingServer.java:253)
12:25:50,317 INFO [STDOUT] at org.jnp.server.NamingServer.lookup(NamingServer.java:256)
12:25:50,317 INFO [STDOUT] at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:530)
12:25:50,317 INFO [STDOUT] at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:644)
12:25:50,317 INFO [STDOUT] at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:509)
12:25:50,317 INFO [STDOUT] at javax.naming.InitialContext.lookup(InitialContext.java:347)
12:25:50,317 INFO [STDOUT] at fec.sb.main.FecEntranceUtil.lookupHome(FecEntranceUtil.java:22)
12:25:50,317 INFO [STDOUT] at fec.sb.main.FecEntranceUtil.getHome(FecEntranceUtil.java:42)
12:25:50,317 INFO [STDOUT] at fec.servlet.FecServlet.doGet(FecServlet.java:132)

環境は
eclipse 3.0.1
jboss 3.2.5
jboss-ide 1.4.0
です。
typer
会議室デビュー日: 2003/09/30
投稿数: 13
投稿日時: 2005-05-19 14:02
以下のXDocletのタグを追加してみてください。

@ejb.util generate="physical"

理由は、以下を読めばおわかりになると思います。

http://xdoclet.sourceforge.net/xdoclet/tags/ejb-tags.html#@ejb_util__0__1_
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-19 14:28
typer さん
レスありがとうございます。
早速試してみたところ、解決いたしました。
ありがとうございます。

PS:ところでわざわざ論理名を設けてJNDI名を直接使わない理由はどこにあるのでしょうか。
typer
会議室デビュー日: 2003/09/30
投稿数: 13
投稿日時: 2005-05-19 16:17
>PS:ところでわざわざ論理名を設けてJNDI名を直接使わない理由はどこにあるのでしょうか。

JNDI名はグローバルな空間に定義されるため、他のJ2EEモジュ−ルで使用されているJNDI名
と衝突が起こる可能性があります。
もし、そうなった場合、JNDI名をハードコードしているとソース修正が必要になってしまいま
す。ソース上は論理名を使用してEJBへアクセスしていればJNDI名の衝突が発生した場合に
JNDI名を変更することによるソースへの影響は無くなるわけです。
なぜなら、論理名とJNDI名の実際のマッピングはDDで行っているからです。
(この場合は、DDを編集することになります。)

[ メッセージ編集済み 編集者: typer 編集日時 2005-05-19 16:18 ]
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2005-05-19 17:49
typerさん
情報いろいろとありがとうございます。
別名の意図も理解できました。

今回別々のVMで立ち上がった2つのJBOSS間で通信をする必要があります。
その場合はNameServer自体が異なるので管理は別になると考えていますが、もし同じVM上のJBOSSアプリケーション間で通信うるとなると衝突の恐れがあるということですね。

ご指摘ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)