[Seasar-user:14263] Re: 質問:EJB2.xとして作られたモジュールをS2へ移行して動かしたい

Applied_MATSUDA Masaaki [E-MAIL ADDRESS DELETED]
2008年 5月 19日 (月) 15:55:44 JST


TigerCat です.

小林さんご回答ありがとうございます.


>であれば,ひとまず SessionBean を AutoRegister で
>登録して試してみてはいかがでしょうか.
>その際,インスタンス属性は prototype で,
>トランザクション制御のインターセプタを
>AspectAutoRegister で設定してください.

ひとまず試しに challenge.dicon を作成し,app.dicon から
include するように設定してみました.
後ほどそのファイル内容を貼り付けます. 


>利用する側は通常の DI の作法で public
>フィールドなり setter メソッドを用意.

S2コンテナから既存の EJB のコンポーネントが取得できるように
なりましたので,早速そのメソッドをひとつ呼び出してみました
ところ,呼び出し先のメソッドからさらに呼び出されるメソッドの
中から NullPointerException が発生して終わりました.

ということで,


>SessionBean が EJB コンテナに依存するコード
>(他の SessionBean を JNDI ルックアップなど)
>を持っている場合はまた相談してください.

EJB 側のソースコードは事情により参照不可能なのですが,
Eclipse がバイナリからリバエンしたオペコードの,例の例外
発生付近を確認してみたところ,やはりコンテキストの lookup
により他の EJB を利用しているふしがあり,それが関係している
気がしました.

ひとまず報告までとなってしまいましたが・・・
なにとぞよろしくお願いいたします.



以下,追加したファイルやコードです.
S2の開発環境は,Dolteng 0.30.0 によるものです.


===== app.dicon

<components>
  <include path="convention.dicon"/>
  <include path="aop.dicon"/>
  <include path="dxo.dicon"/>
  <!-- ADDED -->
  <include path="challenge.dicon"/>
</components>


===== challenge.dicon

<components namespace="challenge">
  <include path="j2ee.dicon"/>
  <component class="org.seasar.framework.container.autoregister.ComponentAutoRegister">
    <property name="instanceDef">
      @[E-MAIL ADDRESS DELETED]
    </property>
    <initMethod name="addReferenceClass">
      <arg>@[E-MAIL ADDRESS DELETED]</arg>
    </initMethod>
    <initMethod name="addClassPattern">
      <arg>"com.hoge"</arg>
      <arg>".*Bean,.*Mediator"</arg>
    </initMethod>
  </component>
  <component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">
      j2ee.requiredTx
    </property>
    <initMethod name="addClassPattern">
      <arg>"com.hoge"</arg>
      <arg>".*Bean,.*Mediator"</arg>
    </initMethod>
  </component>
</components>


===== 動作確認用コード (とりあえずコードなのでひどいものですが)

  SingletonS2ContainerFactory.init();
  UserTransaction ut =
      SingletonS2Container.getComponent(UserTransaction.class);
  try{
    ut.begin();
    HogeBean hoge =
        SingletonS2Container.getComponent(HogeBean.class);
    Column[] list = hoge.getInitializer().getAllColumn();
    System.out.println(list.length + "行");
    ut.rollback();
  }
  catch(Exception e){
    e.printStackTrace();
  }
  SingletonS2ContainerFactory.destroy();



Seasar-user メーリングリストの案内