[Seasar-user:16099] Re: TeedaAjax+S2DaoでClassCastExceptionが発生します。

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 10月 23日 (木) 18:30:14 JST


小林 (koichik) です.

Date:    Thu, 23 Oct 2008 17:52:05 +0900
From:    "Naoto SHINGAKI" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:16097] TeedaAjax+S2DaoでClassCastExceptionが発生します。

> 初めまして。お世話になります。
> teedaAjaxよりKumuを利用しPOSTした際にJavaにてS2Daoを使い
> Daoクラスをインスタンス化すると
(略)
> 以下にException発生付近のソースを転記します。
> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
> 
> S2Container container = S2ContainerFactory.create("jp/co/xxx/XxxDao.dicon");
> container.init();
> XxxDao xxxDao = (XxxDao)container.getComponent(XxxDao.class);
> 
> ーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ClassCastException の前に,ここで S2Container を
生成してはいけません.

このコードだと,リクエストの度に毎回 dicon ファイルを
読み込んで S2Container が生成されてしまいます.
S2Container は TeedaServlet により初期化済みなので,
リクエストの度に生成する必要はありません.

Seasar2.4 では Dao を dicon に登録する必要は
通常ありません.
XxxDao.dicon が本当に必要でしょうか?
もし必要なら app.dicon でインクルードしてください.

また,Dao を得るのに自発的に S2Container から
取得する必要はありません.
Dao を取りに行くのではなく,設定してもらうのが
Dependency Injection です.

XxxLogic から上記のコードを削除し,
インスタンスフィールド

public XxxDao xxxDao;

または,

private XxxDao xxxDao;

public void setXxxDao(XxxDao xxxDao) {
  this.xxxdao = xxxDao;
}

を追加してください.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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