ToStringInterceptorからスーパークラスのフィールドが見えない件

先日のエントリの件です。
http://d.hatena.ne.jp/wataka/20060817#1155794120

やはり勘違いがありました。

S2Containerから取得したインスタンスに対してのみ、アスペクトが適用されるんですね。
よく考えれば当たり前です。

<component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
 <property name="interceptor">toStringInterceptor</property>
 <property name="pointcut">"toString"</property>
 <initMethod name="addClassPattern">
  <arg>"hoge.dto"</arg>
  <arg>".*Dto"</arg>
 </initMethod>
</component>

とした場合、hoge.dto.HodeDtoは(通常Request単位で)1つのオブジェクトがS2Containerに登録されます。

なので、以下のように生成・取得したオブジェクトにはアスペクトが適用されません。

  • S2Dao経由で取得した複数のオブジェクト(List)
  • HogeDto hogeDto = new HogeDto(); で生成した場合

というわけで、Dtoオブジェクトのフィールド値をトレースしたい場合は、toStringメソッドを自分で書くと。

S2JSFのexampleにあるDtoはそんな感じになっています。