S2.4.8でのTDD写経

WEB+DB Press vol.35のTDD写経、現時点最新版のライブラリに置き換えて実行すると最後の章が通りません。最新版で動かすための変更点を書いておきます。(雑誌が出てから相当経過しているので、今更やってる人もいないんじゃないかと思うのだけれど。)

  • S2Daoがけっこう変わっているので、dao.diconはS2Dao最新版付属のものに置き換える
  • S2Daoが取得してくるEntityのBeanがAOPでエンハンスされたサブクラスになっているので、元のクラスに戻さないと予期するXMLと結果が一致しない
    • ←DaoOperationImplクラスのgetById()メソッドの「return entity;」を以下のように変更して元クラスのインスタンスを返す
	BeanEnhancer be = (BeanEnhancer) container.getComponent(BeanEnhancer.class);
	Class orgClass = be.getOriginalClass(entity.getClass());
	Object orgTypeEntity = orgClass.newInstance();
	BeanUtil.copyProperties(entity, orgTypeEntity);
	return orgTypeEntity;
  • ここでbeanをコピーするためにS2FrameworkのBeanUtil.copyProperties(SrcObj,DestObj)を使うと、不具合があって例外が出るので、S2Frameworkを修正してビルド。S2Frameworkの修正点は以下の箇所。(そうでなければcommons-beanutilsを使うとか)

org.seasar.framework.beans.util.BeanUtilクラス

    public static void copyProperties(final Object src, final Object dest,
            final boolean includeNull) {
        final BeanDesc srcBeanDesc = BeanDescFactory
                .getBeanDesc(src.getClass());
        final BeanDesc destBeanDesc = BeanDescFactory.getBeanDesc(dest
                .getClass());

        final int propertyDescSize = destBeanDesc.getPropertyDescSize();
        for (int i = 0; i < propertyDescSize; i++) {
//修正前    final PropertyDesc destPropertyDesc = srcBeanDesc
            final PropertyDesc destPropertyDesc = destBeanDesc  //修正後
            .getPropertyDesc(i);