ToStringInterceptorを使ってみる

 SVNから取得してToStringInterceptorをS2JSF/S2/S2Daoによるユーザ管理アプリケーションに使ってみました。

やったこと

aop.diconを定義
<components namespace="aop">
  <component name="traceInterceptor"
    class="org.seasar.framework.aop.interceptors.TraceInterceptor"/>
  <component name="traceThrowsInterceptor"
    class="org.seasar.framework.aop.interceptors.TraceThrowsInterceptor"/>
  <component name="propertyInterType"
    class="org.seasar.framework.aop.intertype.PropertyInterType" >
    <property name="trace">true</property>
  </component>
  <component name="toStringInterceptor"
    class="org.seasar.framework.aop.interceptors.ToStringInterceptor" >
  </component>
</components>
account.diconを定義
  <component  
    class="org.seasar.framework.container.autoregister.AspectAutoRegister">
    <property name="interceptor">aop.toStringInterceptor</property>
    <property name="pointcut">"toString"</property>
    <initMethod name="addClassPattern">
      <arg>"example.dto"</arg>
      <arg>".*Dto"</arg>
    </initMethod>
    <initMethod name="addClassPattern">
      <arg>"example.entity"</arg>
      <arg>".*"</arg>
    </initMethod>
  </component>

何が便利?

 ComponentAutoRegisterによって一度定義しておけば、コンポーネントを自動登録してくれるように、AspectAutoRegisterによってToStringInterceptorを一度定義しておけば、例えばDtoに変更があっても自動的にtoStringメソッドが組み立てられるので便利です。フィールドの追加が合った場合にtoStringメソッドの変更を忘れるということはよくあります。それを意識しなくて済むのは嬉しいです。地味ですが、開発者の味方になる機能です。

結果

 まずS2Daoが生成するentityにはToStringInterceptorが適用されませんでした。これは[Seasar-dev:224]にある「S2DAOがエンティティを生成するときにコンテナを通さない」ことが原因のようです。同様にこのアプリケーションではPropertyUtils.copyPropertiesを利用したDxoを作っているのですが、そこでもDtoをコンテナを通さずに生成しているために一部のDtoには適用されませんでした。
 Dxo内ではコンテナからDtoのオブジェクトを取得するように変更すれば大丈夫そうですが、S2Daoについてはそちらの変更が必要になるようです。
 

要望

 今回の例ではdtoがentityを継承しているため、S2Daoアノテーションも出力されます。基本的にデバック目的のため、問題ないですが出力は冗長になります。個人的には、例えばToStringInterceptorにアノテーション(_COLUMNなど)もしくはstaticフィールドの出力をOn/Offで切り替えられるスイッチがあれば便利だと思います。