やってみようpart3

クラス構成とトランザクション単位

進んでません。

やはり、

  • action -> logic(jdbcManagerによるDBアクセス)
  • service層はなしとする

という呼び出し方式にしたいなとおもいました。actionの仕事は、

  • リクエストパラメータの受付、ヴァリデーション。
  • logic の呼び出し(複数のlogicを呼ぶこともあり)

と考えます。logicは、

  • DBの検索、更新。1ロジックから複数のテーブルへのアクセスは認めるが、基本的には機能単位で分けられているものとする。
  • entityからdtoの変換はactionでもいいかなとおもったけどlogicにする。

という感じ。問題はトランザクションの開始と終了。これはlogicではなくaction単位とすべき。

という方針は決まるのだが、実現方法がわからない。やりたいことは、

ということなんだけど・・・。

package kizashi.scheduler.logic;


import kizashi.scheduler.dto.UserDto;

import org.apache.log4j.Logger;
import org.seasar.extension.jdbc.JdbcManager;

public class UserLogic {

    public JdbcManager jdbcManager;
    
    private static Logger logger = Logger.getLogger(UserLogic.class);
    
    public UserDto authenticate(String loginId, String passwd) {
        logger.debug("jdbcManager:" + jdbcManager); // null
        return null;
    }
    
}

どうも、customizer.diconが怪しいのだが・・・。みようみまねで以下を追加したが無理だった。

	<!-- added by me at 2008.6.22 -->
	<component name="logicCustomizer"
        class="org.seasar.framework.container.customizer.CustomizerChain">
        <initMethod name="addAspectCustomizer">
            <arg>"aop.traceInterceptor"</arg>
        </initMethod>
        <initMethod name="addCustomizer">
		<arg>
		    <component class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/>
		</arg>
	</initMethod>
    </component>

actionでDIされたjdbcManagerをLogicクラスに引数で渡してしまいたくなるのを必死で抑えています・・・

やはり、Seasarを理解せずに進むのには問題があるということがわかった。

追記(2008/6/23)

  • ひがさんのコメントどおり、LogicではなくServiceを用いることにした
  • ActionにServiceをpublicで宣言するとDIされる
  • ServiceにJdbcManagerをpublicで宣言するとDIされる
  • トランザクション境界はActionとなる
  • 設定ファイルはいじる必要なし

ことがわかりました。

ソース添付の文字コード

sa-struts-blankは便利にも、各種ソースファイルがjarでついてくる。
だがソースを閲覧するときにコメントの日本語が化けてしまうのだ。
以下、回避方法。

  • Window -> Preference -> Workspace で "Text file encoding" の部分をUTF-8に変更する

http://syo.cocolog-nifty.com/freely/2007/08/eclipsejar_4dff.html#comments