やってみようpart3
クラス構成とトランザクション単位
進んでません。
やはり、
- action -> logic(jdbcManagerによるDBアクセス)
- service層はなしとする
という呼び出し方式にしたいなとおもいました。actionの仕事は、
- リクエストパラメータの受付、ヴァリデーション。
- logic の呼び出し(複数のlogicを呼ぶこともあり)
と考えます。logicは、
- DBの検索、更新。1ロジックから複数のテーブルへのアクセスは認めるが、基本的には機能単位で分けられているものとする。
- entityからdtoの変換はactionでもいいかなとおもったけどlogicにする。
という感じ。問題はトランザクションの開始と終了。これはlogicではなくaction単位とすべき。
という方針は決まるのだが、実現方法がわからない。やりたいことは、
- トランザクションはactionのメソッド単位
- xxxLogicクラスにJdbcManagerをフィールドDIする
ということなんだけど・・・。
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