[Seasar-user:10230] Re: SMART deploy ルートパッケージを複数登録した場合の問題

溝口 [E-MAIL ADDRESS DELETED]
2007年 8月 30日 (木) 22:11:31 JST


 小林さんへ、お世話になります。
 溝口です。

いろいろ、確認しました。
まず、OKになったものです。
package jp.blue7;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
public class DummyMain {
	public static void main(String[] args) {
		SingletonS2ContainerFactory.setConfigPath("app.dicon");
		SingletonS2ContainerFactory.init();
		S2Container con = SingletonS2ContainerFactory.getContainer();
		//これが問題ないのは確認できました
		System.out.println(con.getComponent(jp.blue7.daogen.dao.HogeDao.class));
		System.out.println(con.getComponent(jp.blue7.daogen2.dao.HogeDao.class));
		System.out.println(con.getComponent(
                        jp.blue7.daogen.service.AnyService.class));
		System.out.println(con.getComponent(
                        jp.blue7.daogen2.service.AnyService.class));
	}
}
同名のクラスを使ってコンポーネントの取得してみたものです。なって欲しい、動作をしました。
ただし、compoentNameを指定するとTooManyRegistrationRuntimeExceptionが
出てしまいます。compoentNameを使って処理を組んでしまっていたので、これは
SMART deployでは、どうしようもないということですね?。
"daogen__anyService","daogen2__anyService"とかでプレフィックスで呼べるといいなと
思います。

次に、エラーになったパターンは、こんな感じです。
package jp.blue7.daogen.service.impl;
import jp.blue7.daogen.service.AnyService;
import org.seasar.extension.unit.S2TestCase;
public class AnyServiceImplTest extends S2TestCase {
	private AnyService service;
	protected void setUp() throws Exception {
		super.setUp();
		include("app.dicon");
	}
	public void testインスタンスを確認する() throws Exception {
		assertNotNull(service);
	}
}
実験的にS2Unitを使用して動かしてみたときに、エラーを出していました。実際の
開発では、複数の複数のルートパッケージを登録しないので問題ないのですが、
今回、動作検証をするときにやった環境ではエラーになってしまいました。
例外は、java.lang.IllegalArgumentException: Can not set
jp.blue7.daogen.service.AnyService field
jp.blue7.daogen.service.impl.AnyServiceImplTest.service to
jp.blue7.daogen.service.impl.AnyServiceImpl$$EnhancedByS2AOP$$b03be0

という感じです。


07/08/30 に 溝口<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 小林さんへ、お世話になります。
> 溝口です。
>
> 今日、もう一度、確認してみます。今日の夜、また、状況を確認して
> 返事をします。
>
> よろしくお願いします。
>
> 07/08/30 に Koichi Kobayashi<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > 小林 (koichik) です.
> >
> > Date:    Wed, 29 Aug 2007 23:58:19 +0900
> > From:    "溝口" <[E-MAIL ADDRESS DELETED]>
> > To:      [E-MAIL ADDRESS DELETED]
> > Subject: [Seasar-user:10198] SMART deploy ルートパッケージを複数登録した場合の問題
> >
> > > SMART deployを使用し、ルートパッケージを複数登録した場合に、
> > > 同じ名前のインタフェイスを複数登録したいのですが、この際に、
> > > 先に登録したルートパッケージに存在するコンポーネントを取得すると、
> > > 正しく、先に登録したルートパッケージに存在するインタフェイスが
> > > 返ってきます。
> > > しかし、後で登録したルートパッケージに存在するコンポーネントを
> > > 取得すると、先に登録したルートパッケージに存在する、インタフェイス
> > > が返ってきてしまいます。
> >
> > 「取得すると」の意味がよく分からないのですが,
> > S2 の DI のことでしょうか?
> > DI といっても自動バインディングなのか
> > dicon ファイルに <property> 要素で指定を
> > しているのか,どちらでしょうか?
> >
> > http://d.hatena.ne.jp/MIZOMIZO/20070828#1188302689
> >
> > のスタックトレースを見る限りだと,
> >
> > at org.seasar.framework.container.assembler.AbstractBindingTypeDef.setValue(AbstractBindingTypeDef.java:308)
> >
> > 自動バインディングでここに来ることは考えにくい
> > (この一つ下が 210 行目なら自動バインディング,
> > 127 行目ならマニュアル) ので,
> >
> > <property name="schemaVersionDao">schemaVersionDao</property>
> >
> > のようになっているんじゃないかと思われますが,
> > これだとコンポーネントを名前で探すことになるので,
> > 適切に DI することはできないと思います.
> > # あるいはプロパティに @Binding アノテーション
> > # または定数アノテーションを指定しているか.
> >
> >
> > > 当初、SMART deployを使用せず、ComponentAutoRegisterを使用していたのですが、
> > > クライアントのSWINGアプリの起動時間がかかるため、WARM deployを使おうと
> > > 考えまし。
> > 略
> > > インタフェイス名を変更しなければならないでしょうか。それとも、なにか設定方法が
> > > 有りましたら、ご教示ください。
> >
> > 自動バインディングであれば,型でコンポーネントを
> > 探すことができるので問題ないはずです.
> > # 試していませんが.
> >
> > ただし,インタフェース名 (正確にはプロパティの
> > 型名) は規約に従っている必要があります.
> >
> > インタフェースの名前が規約に従っていれば,
> > 最初にプロパティの型でコンポーネントを探しに
> > いくので,コンポーネント定義が作成されて
> > 自動登録されます.
> >
> > しかし,インタフェース名が規約に従っていないと
> > プロパティ名からコンポーネント定義を作成することに
> > なり,最初のルートパッケージで見つかるクラスしか
> > 自動登録されなくなります.
> > この場合,最初のルートパッケージ以外は
> > 型が合わないので DI されません.
> >
> > そんなわけで (どんなわけで?),ルートパッケージ毎に
> > インタフェース名を変える必要はないと思いますが,
> > インタフェース名は規約に合っている必要があります.
> >
> >
> > --
> > <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 mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
>


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