[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 メーリングリストの案内