dbflute-teeda-exampleサンプルが動きません

834 views
Skip to first unread message

Elen

unread,
Mar 29, 2012, 1:09:44 PM3/29/12
to dbf...@googlegroups.com
dbfluteのドキュメントを一通り読んで、スタンドアロンで色々動かせるようになったので
次はteedaとの連携を勉強中です。

SVNリポジトリからdbflute-teeda-example を落としてきて、tomcatのjarファイルの参照先を直しただけで実行し

http://localhost:8080/dbflute-teeda-example/view/member/edit.html

会員一覧→会員編集画面を開いて更新ボタンを押すと例外で落ちました。

java.lang.IllegalStateException: The AccessContext was not found on thread!
com.example.dbflute.teeda.dbflute.allcommon.AccessContext.getAccessUserOnThread(AccessContext.java:75)
com.example.dbflute.teeda.dbflute.allcommon.ImplementedCommonColumnAutoSetupper.handleCommonColumnOfUpdateIfNeeds(ImplementedCommonColumnAutoSetupper.java:83)
com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.setupCommonColumnOfUpdateIfNeeds(AbstractBehaviorWritable.java:706)
com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.frameworkFilterEntityOfUpdate(AbstractBehaviorWritable.java:696)
com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.processBeforeUpdate(AbstractBehaviorWritable.java:583)
com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv.delegateUpdateNonstrict(BsMemberBhv.java:628)
com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv$12.callbackDelegateUpdateNonstrict(BsMemberBhv.java:427)
com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv$12.callbackDelegateUpdateNonstrict(BsMemberBhv.java:1)
com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.helpUpdateNonstrictInternally(AbstractBehaviorWritable.java:191)
com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv.updateNonstrict(BsMemberBhv.java:426)
com.example.dbflute.teeda.web.member.EditPage.doUpdate(EditPage.java:124)


AccessContext は 共通カラムに設定するユーザ名や更新日付を入れておくメモリですよね。
必要なコードがサンプルに足りてないのかな。

スタンドアロンのサンプルプログラムMemberBhvTestでは、テストの前準備として
下記のメソッドを呼び出して初期化していました。

/** 共通カラムの値をセット */
private void setupAccessContext() {
AccessContext context;
boolean isNew = false;
if (AccessContext.isExistAccessContextOnThread())
context = AccessContext.getAccessContextOnThread();
else {
context = new AccessContext();
isNew = true;
}
context.setAccessTimestamp(new Timestamp(new Date().getTime()));
context.setAccessUser("admin");
context.setAccessProcess("MemberBhvTest");
if (isNew)
AccessContext.setAccessContextOnThread(context);
}

public void before() {
setupAccessContext();
}

public void after() {
AccessContext.clearAccessContextOnThread();
}


teedaを使う時は、上の処理をどこに仕掛ければいいのでしょうか?(DIを使う?)

それとエンティティクラス(Memberとか)をhtmlのプロパティにそのまま使うのはやめた方がいいですか?
やっぱりdtoを用意して詰め替えた方がいいのでしょうか。
ajaxからjson経由で取りに来ることも後々ありそうなのでdtoを作る方で検討していますが、
POJOだから詰め替え要らないかも?と少し夢を見ていたので未練が…笑

awaawa

unread,
Mar 29, 2012, 2:26:13 PM3/29/12
to DBFluteユーザの集い
awaawaです。

自分は、基本的にはエンティティクラスをそのまま使っています。
ただし、DBと画面でギャップがある箇所は、Dtoに詰め替えています。(割合でいうとこのケースは少ないです。)
システムの大きさや、複雑さ(DBと画面のギャップが大きいか小さいか)で変わると思いますが。

> ajaxからjson経由で取りに来ることも後々ありそうなのでdtoを作る方で検討していますが、
> POJOだから詰め替え要らないかも?と少し夢を見ていたので未練が…笑
ajaxからjson経由で利用する場合は、dbfluteの「(転送用の)シンプルなDTO」機能を利用するのはどうでしょうか。
http://dbflute.sandbox.seasar.org/ja/manual/function/genbafit/projectfit/simpledto/index.html

On 3月30日, 午前2:09, Elen <e.crimsonn...@gmail.com> wrote:
> dbfluteのドキュメントを一通り読んで、スタンドアロンで色々動かせるようになったので
> 次はteedaとの連携を勉強中です。
>
> SVNリポジトリからdbflute-teeda-example を落としてきて、tomcatのjarファイルの参照先を直しただけで実行し
>
> http://localhost:8080/dbflute-teeda-example/view/member/edit.html
>
> 会員一覧→会員編集画面を開いて更新ボタンを押すと例外で落ちました。
>
> java.lang.IllegalStateException: The AccessContext was not found on thread!
> com.example.dbflute.teeda.dbflute.allcommon.AccessContext.getAccessUserOnTh read(AccessContext.java:75)
> com.example.dbflute.teeda.dbflute.allcommon.ImplementedCommonColumnAutoSetu pper.handleCommonColumnOfUpdateIfNeeds(ImplementedCommonColumnAutoSetupper. java:83)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.se tupCommonColumnOfUpdateIfNeeds(AbstractBehaviorWritable.java:706)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.fr ameworkFilterEntityOfUpdate(AbstractBehaviorWritable.java:696)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.pr ocessBeforeUpdate(AbstractBehaviorWritable.java:583)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv.delegateUpdateNonstrict (BsMemberBhv.java:628)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv$12.callbackDelegateUpda teNonstrict(BsMemberBhv.java:427)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv$12.callbackDelegateUpda teNonstrict(BsMemberBhv.java:1)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.he lpUpdateNonstrictInternally(AbstractBehaviorWritable.java:191)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv.updateNonstrict(BsMembe rBhv.java:426)

awaawa

unread,
Mar 29, 2012, 2:27:16 PM3/29/12
to DBFluteユーザの集い
awaawaです。

自分は、基本的にはエンティティクラスをそのまま使っています。
ただし、DBと画面でギャップがある箇所は、Dtoに詰め替えています。(割合でいうとこのケースは少ないです。)
システムの大きさ、複雑さ(DBと画面のギャップが大きいか小さいか)で変わると思いますが。

> ajaxからjson経由で取りに来ることも後々ありそうなのでdtoを作る方で検討していますが、
> POJOだから詰め替え要らないかも?と少し夢を見ていたので未練が…笑
dbfluteの「(転送用の)シンプルなDTO」機能を利用するのはどうでしょうか。
http://dbflute.sandbox.seasar.org/ja/manual/function/genbafit/projectfit/simpledto/index.html

On 3月30日, 午前2:09, Elen <e.crimsonn...@gmail.com> wrote:
> dbfluteのドキュメントを一通り読んで、スタンドアロンで色々動かせるようになったので
> 次はteedaとの連携を勉強中です。
>
> SVNリポジトリからdbflute-teeda-example を落としてきて、tomcatのjarファイルの参照先を直しただけで実行し
>
> http://localhost:8080/dbflute-teeda-example/view/member/edit.html
>
> 会員一覧→会員編集画面を開いて更新ボタンを押すと例外で落ちました。
>
> java.lang.IllegalStateException: The AccessContext was not found on thread!
> com.example.dbflute.teeda.dbflute.allcommon.AccessContext.getAccessUserOnTh read(AccessContext.java:75)
> com.example.dbflute.teeda.dbflute.allcommon.ImplementedCommonColumnAutoSetu pper.handleCommonColumnOfUpdateIfNeeds(ImplementedCommonColumnAutoSetupper. java:83)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.se tupCommonColumnOfUpdateIfNeeds(AbstractBehaviorWritable.java:706)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.fr ameworkFilterEntityOfUpdate(AbstractBehaviorWritable.java:696)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.pr ocessBeforeUpdate(AbstractBehaviorWritable.java:583)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv.delegateUpdateNonstrict (BsMemberBhv.java:628)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv$12.callbackDelegateUpda teNonstrict(BsMemberBhv.java:427)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv$12.callbackDelegateUpda teNonstrict(BsMemberBhv.java:1)
> com.example.dbflute.teeda.dbflute.allcommon.bhv.AbstractBehaviorWritable.he lpUpdateNonstrictInternally(AbstractBehaviorWritable.java:191)
> com.example.dbflute.teeda.dbflute.bsbhv.BsMemberBhv.updateNonstrict(BsMembe rBhv.java:426)

Elen

unread,
Mar 29, 2012, 9:39:04 PM3/29/12
to dbf...@googlegroups.com
awaawaさん、ありがとうございます。

私もawaawaさんに習ってエンティティクラスをそのまま使ってみようと思います。


> ajaxからjson経由で利用する場合は、dbfluteの「(転送用の)シンプルなDTO」機能を利用するのはどうでしょうか。
> http://dbflute.sandbox.seasar.org/ja/manual/function/genbafit/projectfit/simpledto/index.html

こんな便利な機能があったんですね。見落としていました。
JSONIC連携のサンプルまであるなんて、どこまで痒い所に手が届くんだか。


2012年3月30日金曜日3時26分13秒 UTC+9 awaawa:

Elen

unread,
Mar 30, 2012, 1:41:25 AM3/30/12
to dbf...@googlegroups.com
>java.lang.IllegalStateException: The AccessContext was not found on thread!

自己解決できました。
S2ContainerやDI&AOPの知識が浅いので、これで合っているのか自信がないですが。

app_aop.diconに追加 >>>
+   <component name="accessContextInterceptor"
+              class="com.example.dbflute.teeda.appcore.AccessContextInterceptor"
+              instance="singleton"/>
app_aop.diconに追加 <<<

customizer.diconに追加 >>>
  <component name="pageCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
+    <initMethod name="addCustomizer" >
+     <arg>
+        <component class="org.seasar.framework.container.customizer.AspectCustomizer">
+          <initMethod name="addInterceptorName">
+            <arg>"app_aop.accessContextInterceptor"</arg>
+          </initMethod>
+          <property name="pointcut">"do.*, initialize, prerender"</property>
+        </component>
+      </arg>
+    </initMethod>
customizer.diconに追加 <<<

com.example.dbflute.teeda.appcore.AccessContextInterceptor を作成 >>>
+public class AccessContextInterceptor extends AbstractInterceptor {
+    public Object invoke(MethodInvocation invocation) throws Throwable {
+           AccessContext context = new AccessContext();
+           ...
+           AccessContext.setAccessContextOnThread(context);
+    }
com.example.dbflute.teeda.appcore.AccessContextInterceptor を作成 <<<



2012年3月30日金曜日2時09分44秒 UTC+9 Elen:

kubo

unread,
Mar 30, 2012, 1:19:24 PM3/30/12
to dbf...@googlegroups.com
jfluteです。

Elenさん、こんばんは

すいません、反応できなくて。
自己解決の通りです。AOPで設定して初期化する感じです。
ちなみにdbflute-teeda-exampleは、あえて古いバージョンの
DBFluteを使っているのでご注意ください。

> それとエンティティクラス(Memberとか)をhtmlのプロパティにそのまま使うのはやめた方がいいですか?
> やっぱりdtoを用意して詰め替えた方がいいのでしょうか。

少なくとも、フレームワークがなんだろうが、コンパイルされない領域で、
直接Entityのプロパティを参照すると、カラム名の変更やカラム削除したときに、
コンパイルエラーで検出できなくなるので、そのデメリットを背負う必要があります。
何に重点を置くかによるわけですが、DBFluteの特徴を減らす要因ではあるので、
自分は面倒でもDTOをしっかり作って詰め替えるのを周りには奨めています。

Teedaだと...ExampleだとPageクラス自体がDTOになってるような...
(ちょっとあまりに久しぶりでどうなってたかなぁと思い出してる最中です)


2012/3/30 Elen <e.crim...@gmail.com>:

> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/dbflute/-/FeCiL6GD3hEJ
> にアクセスしてください。
>
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。

Elendira Crimsonnail

unread,
Mar 30, 2012, 1:50:41 PM3/30/12
to dbf...@googlegroups.com
jfluteさん、

アドバイスありがとうございます。

> ちなみにdbflute-teeda-exampleは、あえて古いバージョンの
> DBFluteを使っているのでご注意ください。


これは、最新のteedaと最新のdbfluteの相性が悪いと云う意味ではないですよね?

> Teedaだと...ExampleだとPageクラス自体がDTOになってるような...


そうですね。なってました。
teedaも始めたてですが、フォームの入力を受け取る変数と、for
each用のループ変数と、出力専用のメッセージ系変数などが、クラスのフィールドにごっちゃになってるのが、ちょっと分かり難いなーと感じています。コメント書くの大事ですね。
strutsを使っていた時はそれぞれクラスに分割して、cond.memberNameとかloop.memberとかネスト参照させていました。

kubo

unread,
Mar 30, 2012, 10:26:34 PM3/30/12
to dbf...@googlegroups.com
jfluteです。

>> ちなみにdbflute-teeda-exampleは、あえて古いバージョンの
>> DBFluteを使っているのでご注意ください。
>
>
> これは、最新のteedaと最新のdbfluteの相性が悪いと云う意味ではないですよね?

おっと、誤解を与えるような表現してしまった申し訳ありません。
DBFluteはWEB層に対して何もアプローチしてませんので、全然関係ないです。
単に、古いバージョンのDBFluteの環境も残しておかないとということで、
TeedaのExampleでそのようにしているだけです。

> each用のループ変数と、出力専用のメッセージ系変数などが、クラスのフィールドにごっちゃになってるのが、ちょっと分かり難いなーと感じています。コメント書くの大事ですね。

そうなんです。なので、プログラマには最初しっかり
説明しないと混乱してしまいます。
コメント書いてメソッドをしっかりカテゴリ分けして
いくようにした方がいいですね。

2012/3/31 Elendira Crimsonnail <e.crim...@gmail.com>:

Elen

unread,
Apr 10, 2012, 1:58:15 AM4/10/12
to dbf...@googlegroups.com
jfluteさん、

dbflute-teeda-exampleを最新のteedaと最新のdbfluteで動かしてみた所、
WARNメッセージが出てしまいました。
何か仕様が変わったのか?チェックが厳格になったのか?

2012-04-10 14:39:15,614 [http-18080-1] DEBUG org.seasar.framework.aop.interceptors.TraceInterceptor - BEGIN com.example.dbflute.teeda.web.member.SearchPage#initialize()
2012-04-10 14:39:15,619 [http-18080-1] DEBUG org.seasar.extension.jta.TransactionImpl - トランザクションを開始しました。tx=[FormatId=4360, GlobalId=1334036355619/0, BranchId=]
2012-04-10 14:39:15,620 [http-18080-1] WARN  org.seasar.framework.container.hotdeploy.HotdeployClassLoader - HOT deploy対象クラス(com.example.dbflute.teeda.dbflute.cbean.MemberStatusCB)が非対象クラスから参照されて通常のクラスローダにロードされています。
2012-04-10 14:39:15,690 [http-18080-1] WARN  org.seasar.framework.container.hotdeploy.HotdeployClassLoader - HOT deploy対象クラス(com.example.dbflute.teeda.dbflute.cbean.bs.BsMemberStatusCB$HpSpecification)が非対象クラスから参照されて通常のクラスローダにロードされています。
2012-04-10 14:39:15,767 [http-18080-1] WARN  org.seasar.framework.container.hotdeploy.HotdeployClassLoader - HOT deploy対象クラス(com.example.dbflute.teeda.dbflute.cbean.cq.MemberStatusCQ)が非対象クラスから参照されて通常のクラスローダにロードされています。
2012-04-10 14:39:15,784 [http-18080-1] WARN  org.seasar.framework.container.hotdeploy.HotdeployClassLoader - HOT deploy対象クラス(com.example.dbflute.teeda.dbflute.exbhv.MemberStatusBhv)が非対象クラスから参照されて通常のクラスローダにロードされています。
2012-04-10 14:39:15,880 [http-18080-1] DEBUG org.seasar.dbflute.XLog - ...Initializing sqlExecution for the key 'MEMBER_STATUS:selectList(MemberStatusCB):MemberStatus'



2012年3月31日土曜日 11時26分34秒 UTC+9 jflute:

>>> このグループに投稿するには、dbflute@googlegroups.com にメールを送信してください。
>>> このグループから退会するには、dbflute+unsub...@googlegroups.com にメールを送信してください。


>>> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>>
>> --
>> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。

>> このグループに投稿するには、dbflute@googlegroups.com にメールを送信してください。
>> このグループから退会するには、dbflute+unsub...@googlegroups.com にメールを送信してください。


>> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>>
>
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。

> このグループに投稿するには、dbflute@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+unsub...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>

kubo

unread,
Apr 10, 2012, 2:10:06 AM4/10/12
to dbf...@googlegroups.com
jfluteです。

> dbflute-teeda-exampleを最新のteedaと最新のdbfluteで動かしてみた所、
> WARNメッセージが出てしまいました。
> 何か仕様が変わったのか?チェックが厳格になったのか?

Seasarのチェックというか、ログ通知が厳格になってるようですね。
ホットデプロイ対象のクラスが他のクラスローダーに読まれて
ホットデプロイの対象じゃなくなったらWARNが出るようです。
ルートパッケージ配下にクラスを置くとホットデプロイ対象になるので、
それで自動生成クラスまでが対象になってログに出てしまうようです。

自動生成クラスがホットデプロイ対象である必要はほとんどないので、
convention.dicon でDBFluteの自動生成クラスのパッケージを
ホットデプロイ対象から外してあげると良いです。
NamingConventionImpl.addIgnorePackageName()を使えば指定できます。

実業務だと、DBFluteの自動生成クラスって、Eclipse上の別プロジェクト
にして、プロジェクト参照(実行時はjar参照)にして複数のプロジェクトから
再利用できるようにすることが多いので、問題にはなりませんが。

2012/4/10 Elen <e.crim...@gmail.com>:

>> >>> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
>> >>> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。


>> >>> 詳細については、http://groups.google.com/group/dbflute?hl=ja
>> >>> からこのグループにアクセスしてください。
>> >>
>> >> --
>> >> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。

>> >> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
>> >> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。


>> >> 詳細については、http://groups.google.com/group/dbflute?hl=ja
>> >> からこのグループにアクセスしてください。
>> >>
>> >
>> > --
>> > このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。

>> > このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
>> > このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。


>> > 詳細については、http://groups.google.com/group/dbflute?hl=ja
>> > からこのグループにアクセスしてください。
>> >
>
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。

> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/dbflute/-/LuGDPOOtykAJ
> にアクセスしてください。
>
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。

Elen

unread,
Apr 10, 2012, 2:40:36 AM4/10/12
to dbf...@googlegroups.com
jfluteさん、ありがとうございます。

> 自動生成クラスがホットデプロイ対象である必要はほとんどないので、
> convention.dicon でDBFluteの自動生成クラスのパッケージを
> ホットデプロイ対象から外してあげると良いです。
> NamingConventionImpl.addIgnorePackageName()を使えば指定できます。

こちらの方法で警告が消えました。

> 実業務だと、DBFluteの自動生成クラスって、Eclipse上の別プロジェクト
> にして、プロジェクト参照(実行時はjar参照)にして複数のプロジェクトから
> 再利用できるようにすることが多いので、問題にはなりませんが。

なるほど普通は別けるのですね。
その場合、DBFluteの自動生成側プロジェクトはDolteng Project(Application Type: Standalone)で作成して、
クラスファイル全部とdbflute.diconをjarで固めて参照先WEB-INF/libにコピーでしょうか。
試してみます。


2012年4月10日15:10 kubo <dbf...@gmail.com>:

kubo

unread,
Apr 10, 2012, 2:48:37 AM4/10/12
to dbf...@googlegroups.com
jfluteです。

> なるほど普通は別けるのですね。

いやまぁ、アプリが一つだけならそうしなくてもOKですよ。
ただ、よくあるのは、ユーザサイトと管理サイトとバッチとって
分かれるので、そういうときは自動生成クラスをJARにして再利用と。

> その場合、DBFluteの自動生成側プロジェクトはDolteng Project(Application Type: Standalone)で作成して、
> クラスファイル全部とdbflute.diconをjarで固めて参照先WEB-INF/libにコピーでしょうか。
> 試してみます。

そんな感じですね。
(まあ、自分は最近すっかり Dolteng 使う機会がないですが...)
Mavenやプラグインとかを使うともっとスマートに管理できるかと。
ただ、Maven自体が色々とややこしいので大変ですが。

2012/4/10 Elen <e.crim...@gmail.com>:

Elen

unread,
Apr 10, 2012, 5:30:58 AM4/10/12
to dbf...@googlegroups.com
jfluteさん、ありがとうございます。

別プロジェクトに分けてスッキリしました。


2012年4月10日15:48 kubo <dbf...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages