[Seasar-user:18435] Re: [S2Unit]インタフェースなしクラスへのMockInterceptor適用
Koichi Kobayashi
[E-MAIL ADDRESS DELETED]
2009年 9月 3日 (木) 04:30:48 JST
小林 (koichik) です.
Date: Thu, 3 Sep 2009 03:58:34 +0900
From: [E-MAIL ADDRESS DELETED]
To: [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:18434] [S2Unit]インタフェースなしクラスへのMockInterceptor適用
> 下記のようにdiconファイルにてMockInterceptorの指定を行っているにも関わらず
> 、
> Serviceクラス内の@Resourceが付加されているDaoコンポーネントが自動設定でき
> ない
> と言われてしまいます。
>
> <component name="mockInterceptor"
> class="org.seasar.framework.aop.interceptors.MockInterceptor">
> <initMethod name="setReturnValue">
> <arg>略</arg>
> <arg>略</arg>
> </initMethod>
> </component>
> <component class="Serviceクラス名">
> <aspect>
> mockInterceptor
> </aspect>
> </component>
>
> Action, Service, Daoはcreator.diconで自動的にコンポーネント定義されている
> ので、
> そちらが優先されてしまっているのかと想像して、
> DaoCreatorを解除してみたりしたのですが、状況は変わりませんでした。
SMART deploy で自動登録されるコンポーネントは
ルートのコンテナに定義されます.
上記の定義が xxx.dicon に定義されているとして,
それをインクルードするとルートの子供のコンテナに
なるため,上記サービスから親 (ルート) のコンテナに
定義された Dao を参照することはできません.
コンテナとスコープの関係は以下を参照してください.
http://s2container.seasar.org/2.4/s2-framework/ja/apidocs/org/seasar/framework/container/S2Container.html
対応としては,@Resource の代わりに
@Binding(bindingType=BindingType.MAY)
を指定するか,以下の方法で上の定義をした dicon を
ルートのコンテナとなるようにしてください.
S2Unit の場合は getRootDicon() をオーバーライド
してください.
protected String getRootDicon() {
return "xxx.dicon";
}
S2Unit4 の場合は @RootDicon アノテーションで
指定してください.
@RootDicon("xxx.dicon")
--
<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 メーリングリストの案内