ひとつのインターフェースで複数のEJBクラスを参照する方法

このQ&Aのポイント
  • EJBを使った開発を行っている際に、複数のEJBクラスをひとつのインターフェースで参照する方法について知りたいです。
  • 現在はRemoteインターフェース、Homeインターフェース、EJBクラス1を1対にしているのですが、Remoteインターフェース1、Homeインターフェース1、EJBクラス1のような1対Nの関係で呼び出しを行いたいです。
  • 可能なのかどうか、もしくはその他の方法があるのかを教えていただけると助かります。
回答を見る
  • ベストアンサー

ひとつのインターフェースで複数のEJBクラスを参照する

はじめまして、MAKOTOと申します。 EJBを使った開発を行っているのですが、 サーブレットからEJBクラスを呼ぶとき 現在はRemoteインターフェイス、Homeインターフェース、EJBクラス1を1対 にしているのを Remoteインターフェイス1 Homeインターフェース1 EJBクラス1 Remoteインターフェイス2 Homeインターフェース2 EJBクラス2 ↓のように1対Nの関係で呼び出しを行いたい Remoteインターフェイス Homeインターフェース EJBクラス1 EJBクラス2 EJBクラス3 EJBクラス4 EJBクラス5 このようなことは可能なのでしょうか?

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#16216
noname#16216
回答No.1

おそらく、EJBの継承を考えた呼び出しということなんだと思います。 実際に簡単なEJBを作成し、JBoss上でEJBを実行してみたところ、 可能でした。 メインのEJBクラス(デプロイメントディスクリプタに指定EJBクラス) public class MultipleBean implements SessionBean {  protected MultipleBean beanObj;  public void message() throws RemoteException {   beanObj.message();  }  public void ejbCreate(String implementors) throws RemoteException {   try {    beanObj = (MultipleBean)Class.forName(implementors).newInstance();   } catch (Throwable ex) {    throw new RemoteException();   }  } ---- EJBクラス1 ---- public class MultipleBean1 extends MultipleBean {  public void message() {   System.out.println( "MultipleBean1 Call" );  } } ---- EJBクラス2 ---- public class MultipleBean2 extends MultipleBean {  public void message() {   System.out.println( "MultipleBean2 Call" );  } } これで、EJBクライアント(確認では単純なJavaクラスですやりましたが)で Homeインタフェースを使ってcreateするときに、引数でクラス名を指定して やると、確かにそれぞれのEJBを呼ぶことはできました。。。 ただし、あくまでも呼び出せるかどうかを検証したレベルであり、EJBクラス(業務ロジック)が 複雑だったり、複数クライアントからの要求はもちろん、いろんな状況で正しく動くかどうかは 確認していませんので、もし実際にこのようなコードを記述するなら、もっと考慮が必要だと思いますが、、、 EJBコンテナがEJBクライアントからEJBクラスにアクセスするための方法としてRemote インタフェースとHomeインタフェースを提供するという前提を考えると、どうも小手先だけの 間違った実装のような気もしますね。。。 本当なら、やはり1対1で対応するようにRemoteインタフェースとHomeインタフェースを定義すべきなんだと思いますが。。。

k-makoto
質問者

お礼

spoonyさんお返事ありがとうございました。 その後色々と考えたり、周りの人に相談したりしたのですが、 確かにspoonyさんのご指摘にもあったように ↓の構成のように1対1の関係の設計の方が いいような気がします。          |-------------Home--------          |                   | クライアント--|                  Bean          |                   |          |-------------Remote----- 下手に継承などをつかわずに単純にしたほうが確かに見やすいと思います。 そもそもなぜこのようなことをしたかったのかというとEJBの呼び出しを 共通化させたかったのです。現在↓のようなシステムの構成を考えています。 親サーブレット-------------|                   |                   |                   |----子サーブレット1-------EJB1                   |                   |                   |                   |----子サーブレット2-------EJB2                   |                   |                   |                   |----子サーブレット3-------EJB3                   |                   |                   |                   |----子サーブレットN-------EJBN 親サーブレットは子サーブレットの共通する処理を定義し、 子サーブレットはその機能独自の処理のみを実行するようにして、 共通化された部分は単純に親から呼び出すといった形にしたかったのです。 そしてその共通化させるという中にインタフェースの呼び出しがありその呼び出しを 共通化させるため1つのHome、Remoteインタフェースで複数の Beanのインスタンス化を行いたかったのです。 子サーブレットは親サーブレットにどのBaenのインスタンス化を行うか メッセージを送り、親サーブレットはそのメッセージを受け取りHome、 Remoteインタフェースの作成を行い、子サーブレットは単純に 呼び出すだけにしたかったのです。

その他の回答 (1)

noname#16216
noname#16216
回答No.2

> 子サーブレットは親サーブレットにどのBaenのインスタンス化を行うか > メッセージを送り、親サーブレットはそのメッセージを受け取りHome、 > Remoteインタフェースの作成を行い、子サーブレットは単純に > 呼び出すだけにしたかったのです。 すみません。 どうも、大きな勘違いをしていたようです。 ↓に示されたようなシステムにおいて、子サーブレットからのメッセージに 合わせて親サーブレット内でEJBにアクセスするというのであれば、単純に デプロイメント・ディスクリプタ内で同一のRemote、Homeインタフェースを 持つ別のEJBを定義してやればよい話ですね。。。 ejb-jar.xml で  <ejb-name>beanmultiple1</ejb-name>  <home>beanMultiple.BeanMultipleHome</home>  <remote>beanMultiple.BeanMultiple</remote>  <ejb-class>beanMultiple.BeanMultipleBean</ejb-class>           :  <ejb-name>beanmultiple2</ejb-name>  <home>beanMultiple.BeanMultipleHome</home>  <remote>beanMultiple.BeanMultiple</remote>  <ejb-class>beanMultiple.BeanMultipleBean2</ejb-class>           : という感じで、同一のインタフェースを持つ2つのEJBを定義し、別々の 名前でJNDIに登録しておいて、例えば子サーブレットからメッセージとして JNDI名をもらって親サーブレットでもらったJNDI名を使ってEJBを呼び出す という方法をとればいいのではないでしょうか? これだと、EJBクラスに1対1に対応するHomeインタフェースと Remoteインタフェースが存在することになり、EJBの設計上、問題 ないように思います。

k-makoto
質問者

お礼

何度もお返事をいただいて誠にありがとうございます。 この方法でもう一度設計をよく見直して行きます。 後、ポイントをつけるのを忘れてしまい申し訳ありませんでした。

関連するQ&A

  • 「ひとつのインターフェースで複数のEJBクラスを参照する」の続き

    「ひとつのインターフェースで複数のEJBクラスを参照する」の続き こんにちは、k-makotoと申します。 インターフェースが同じなら↓のような構成は可能でしょうか? 「ひとつのインターフェースで複数のEJBクラスを参照する」の投稿の 続きなのですが、 仮にBeanごとにインタフェースが違うならこの構成はむりなのでしょうか? 子サーブレット1                                 Bean1 子サーブレット2---共通HomeI/F、共通HomeI/F-----Bean2 子サーブレット3                                 Bean3 子サーブレットN                                 BeanN Bean1の機能 データベースの検索 Data_Search() 検索結果をCSVファイルで取得する Get_Csv() Bean2の機能 テーブルの更新 Data_Update() テーブルの新規作成 Data_New() BeanNの機能 ........ のような場合だったら共通RemoteI/F側にBean1~Nのインタフェースの定義をしてさらに Bean1~Nに使わないインターフェースの実装も行わないとだめだということですよね.... .

    • ベストアンサー
    • Java
  • インタフェースについて

    現在、EJBにてをWebシステムを開発しようとしている者です。そこでふと気になったことがあります。 それは、EJBにおいてローカルインタフェース、Homeインターフェイス、Remoteインターフェイスは一体それぞれどういう役割があり何の意味があるのか?ということです。普通のJavaBeansではなぜいけないのか? いろいろ、参考書見てもネットで調べてもピンとこないので誰か分かりやすく教えてくれる方いたらアドバイスお願いします。

    • ベストアンサー
    • Java
  • EJBコンテナ。

    OJT期間中でサーバサイドを勉強中です。 アプリケーションサーバーの使用で組んだEJBをデプロイ(配置ですか)したときのコンテナの動作を知りたいです。 ちなみに基本的にアプリケーションサーバはオートデプロイで、jarファイルを当該ディレクトリに置いたとき、自動的にEJBが認識されます。 そもそも、EJBのコンテナとは、アプリケーションサーバにEJBが認識された時に作られるものなのでしょうか? クライアントからEJBの機能を呼び出そうとしたときにコンテナを意識したことはありませんが、参照の取得の過程でHomeインターフェース、Remoteインターフェース、Beanは一体どのような過程を辿ってインスタンスを生成し、実行可能状態に至るのでしょうか? また、Beanで実装したビジネスメソッドを実行する過程はどのようなものでしょうか?(まぁ、インスタンスが生成されれば普通にメソッドが呼び出されるのですが) 内部の概念の部分で、知る必要がないかも知れませんが、知りたいのでぜひ教えてください。 ちなみに java.sun.com のサイトにあるj2eetutorial を見て勉強中ですが、そこの説明は表層的なもののようでよくわかりません。 それと、余裕がありましたら、複数のサーブレットに渡って一つの EJB インスタンスを使用する方法(Sessionに設定する以外に)を教えてください。 いまいちよく分かっていないので、質問内容が的外れになっているかも知れませんが、よろしくお願いします。 説明するのが面倒くさいという方は解説のあるページを教えていただくだけでも結構です。

    • ベストアンサー
    • Java
  • EJB(Enterprise Java Beans)のSessionBeanと普通のJavaクラスのアクセス

    こんにちは! 問題は山のようにあるんですが、とりあえず、 EJBを作る際にSessionBeanを作ったんですが、そのBean以外に DBにアクセスするクラスを自分で勝手に作ったら”abstract”だと 怒られるのですが、 ・普通のクラスを使用するのは根本的に間違ってるのでしょうか? また、 ・他にEntityなりSessionなり(よく違いを理解していなくてすいません・・・) でやる場合は、やはり新しくHomeやRemoteが必要なのでしょうか? 以上なんですが、わかる方がいらっしゃたらお願いします。 ※番外編なんですが、もしAPWORKS(富士通さんの)お使いの方いらっしゃいま したら、EJBを作る時の新規DAクラス作成方法を教えてください。 ながながとすんません。。。でした

    • ベストアンサー
    • Java
  • War、Earファイルについて

    こんにちは、k-makotoと申します。Weblogic7.0で 開発を行っているのですが、War、Jar、Earファイルについて 質問があります。 現在 EJB、サーブレット、JSP、HTML、イメージ、その他ファイル これらをまとめたものをWar形式で圧縮して動かそうとしているのですが、 War形式かEar形式どちらの方法で圧縮させればよいのでしょうか?

    • ベストアンサー
    • Java
  • 今のJavaの業務開発はどんな感じですか?

    すみません。よろしくおねがいします。 3年ほど前(JDK1.4の頃)まで、Javaのプログラマをやっておりました。当時、僕はサーブレットとJSPが主で時々EJBを使うような開発に携わっておりました。 半年か1年後くらいに、もう一度、就職しようともくろんでいるんですが、現在色々な技術がありますよね。 書店で色々見てると、フレームワークだとStruts、JSF。他にもEJB関係だとJMI、XDoclet。その他としてJUnit、Hibrateとかいうのがあるみたいです。。 実際、開発現場ではどの辺の技術を使っているんでしょうか? ちなみに、僕の入社する企業は高卒程度のところしか入れません。ですから、あまりバリバリのプログラマばかりの開発現場ではないです。 その辺を前提として回答のほうを頂けたらなあと思っております。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 循環参照の問題に関して。

    現在設計の段階なのですが、あるクラスが循環参照に陥りそうで実装に踏み切れません。 現在の状況で循環参照の問題が発生するのか、またどのような開発が循環参照の問題になるのか、教えていただきたいと思います。 現在の状況は、 mainにControlというクラスが実体で多重度1で持たれている。 ControlにDeviceというクラスが多重度0..nでポインタでもたれている。 DeviceというクラスはControlというクラスの参照を持つ。 このような状況になっています。 問題の関係はControlとDeviceです。 このような状況に詳しい方がいらっしゃいましたら、回等をお願いいたします。

  • HTMLControlクラス

    現在下記参考サイトをみながらFlashでAIRの開発をしたいと思っているます。 http://www.adobe.com/jp/newsletters/edge/september2007/articles/article2/index.html ソースをダウンロードしてコンパイルするとエラーだらけになってしまいます。 HTMLControlクラスが使用できていない様子です。 AIRのインストール・FlashのAIR用アップデートは行いました。 HTMLControlクラスを使用できる方法、または上記ソースをコンパイルする方法(設定)を教えて頂けないでしょうか? エラー文言 1172:定義 flash.html:HTMLControlが見つかりません。 1180:未定義である可能性が高いメソッドHTMLControlの呼び出しです。 等表示されています・・・ よろしくお願い致します。

    • ベストアンサー
    • Flash
  • どうしても、サーブレットを見つけてくれない場合の解決方法

    ルートディレクトリからWEB-INFを辿って、classesまで行き、そこにパッケージ化したクラスファイルを置きます。 それでも何故かサーブレットを見つけてくれません。 PC上には他に、EclipseとJudeというUML開発ツールが入っています>関係ないかもしれませんが。 勿論、invokerのコメントを外し、サーブレットも使えるのですが……。 とても困っています。 どんな方法でも構いませんので、是非ともレスを下さい。お待ちしております。

  • アクセス修飾子の指定相手と、そのスコープとの関係性。

    アクセス修飾子の指定相手と、そのスコープとの関係性。 Java初心者であるため、変なことを言うかもしれませんが、宜しくお願い致します。 クラスや、メンバにアクセス修飾子は付けられますが、 その修飾のしかたの組み合わせによって、 アクセスできるスコープが色々と場合分けされると思うのですが、 このあたりは、どう考えたら良いのでしょうか? 例えば、 //(1) public class MyClass1 {  private int n1; } //↑クラス自体は、どこからでも使用可能だが、 //フィールドn1はMyClass1内部からのみ使用可能。 //(2) private class MyClass2{  public int n2; } //↑ん~、なんだこりゃ~??(こんな書き方はない??) //------------------------------ //(3) public interface MyInterface{  int n3 = 3; } //↑インターフェース自体も、そのフィールド(定数)n3も、どこからでも使用可能! //(4) interface MyInterface{  int n4 = 4; } //↑インターフェース自体も、そのフィールド(定数)n4も、 //同じパッケージ内からのみ使用可能! //(5) abstract interface MyInterface{  int n5 = 5;  void mymethod();  //自動的にpublic abstract指定になるのですよね…?  abstract mymethod2();  //publicだけ、自動指定される扱い、といった感じで…。 } //↑なんじゃこりゃー!わかりませんっ! //もし仮に、このインターフェースにメソッドを書かないとエラーが出ます? //というか、インターフェースにabstractキーワードを指定できる意味がよく分かりません。 //------------------------------ (1)~(2)がクラス編、(3)~(5)がインターフェース編。 特に(2)、(5)について、どなたかアドバイスして下さい。

    • ベストアンサー
    • Java

専門家に質問してみよう