[Seasar-user:10308] Re: [Teeda]Teeda1.0.11-RC1の@PageScope、@SubapplicationScopeの挙動について

橋本 昇 [E-MAIL ADDRESS DELETED]
2007年 9月 5日 (水) 00:14:47 JST


TO:大谷さん

橋本です。
SNAPSHOTありがとうございます。

TestPageでの動作を確認をいたしました。

また、PageScopeの値もSessionPagePersistenceにてSubapplicationScope同様
Externalバインディングの対象になっている事も確認しました。
これでおそらく値の復旧タイミングは私の希望通りになったのではないかと思っ
ています。
※グレーな回答ですみません。技術的にあまり自信がないです。(^-^;;
要望を聞いていただいてありがとうございます。


余談ですが、私が気がついた点を2つ。
1.
TEEDA-351対応の為のコードが現在残っています。
HtmlViewHandler#renderViewのコード
boolean changed = false;
if (postback) {
changed = pageScopeHandler.toPage(pageDesc, context);
}
と、
PageScopeHandler#toPageメソッド

今回の対応で値の復旧はExternalバインディングに任せたため一見不必要かと思
われます。
※実際SessionScopeHandlerにはtoPageメソッドはありません
ただし、changedによって変更を検出しているという点、SubapplicationScopeと
の非対象性の意図により、私には判断つきかねます。(^-^;;
しかし、残す場合にはPageScopeHandlerImpl#toPageでpropertyDesc.setValueを
呼び出す前に書き込み可能なプロパティであるかを検出した方が良いかと思われ
ます。
間違った使い方の時にしか問題は発生しませんので必須対応ではないと思います
が、気がついたためご報告。
※getterしかないプロパティに@PageScopeを付けた場合に例外が発生します。

2.
SessionPagePersistence#restore(今回の修正箇所です)にてExternalContext
から取得した RequestMapにSubapplicationScope、RedirectScope、PageScopeの
値を挿入しているのですが、 Teedaとして動作上必須な下記の項目と同じ名前の
項目があった場合は上書きされてしまいます。

少なくとも3種のスコープの値を格納する前には下記の値がすでに格納されてい
ます。
・org.seasar.framework.container.hotdeploy.HotdeployFilter
・facesContext
・previousViewId
・postback

これらと同じ名前のプロパティにスコープアノテーションを間違って(ありえる
のか?あったから気がついたわけですが・・・)付けてしまった場合は正しく動
作しなくなります。
勿論「そんな事をしてはいけません」の一言で終わるわけですが、今後このよう
な値が増えるのか?また、これですべてであるのかが私には判断できません。
もし、フレームワークとして予約語のようなものをある程度定義できるのでした
ら、これらと同じ名前のものにスコープアノテーションが付けられている
場合はそれを無効とするというコードが記述されていれば、余計なトラブルの種
が減ると同時に、フレームワークのコードを読んだりするような方へのメッセー
ジ性が増すと思われます。

フレームワークとして対応するべきか微妙ですが一応ご報告。


2点、重箱の隅をつつくような内容ですので流していただくことも可かと思いま
すが、間違った使い方をそもそもできないようにするという視点ではアリかとも
思い、ご報告させていただきました。


以上です。
スコープアノテーションの対応ありがとうございました。


Shinpei Ohtani wrote:
> 大谷です.
>
> SNAPSHOTをデプロイしました.
> 下記を試してもらえるでしょうか.
>
> http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-ajax/1.0.11-SNAPSHOT/teeda-ajax-1.0.11-20070904.044943-3.jar
>
> http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-core/1.0.11-SNAPSHOT/teeda-core-1.0.11-20070904.044943-3.jar
>
> http://maven.seasar.org/maven2-snapshot/org/seasar/teeda/teeda-extension/1.0.11-SNAPSHOT/teeda-extension-1.0.11-20070904.044943-3.jar
>
>
> 宜しくお願いします.
>
> 07/09/04 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
>   
>> 大谷です.
>>
>> https://www.seasar.org/issues/browse/TEEDA-358
>>
>> として、修正しました.
>> SNAPSHOTを作成しようと思うので、確認してもらっても
>> よいでしょうか?
>> 宜しくお願いします.
>>
>> 07/09/02 に Shinpei Ohtani<[E-MAIL ADDRESS DELETED]> さんは書きました:
>>     
>>> 大谷です。
>>>
>>> お返事遅くなりすいません.
>>> 下記、ちょっと調べてみるのでもう少しお時間下さい.
>>> よろしくお願いします.
>>>
>>> 07/08/31 に 橋本 昇<[E-MAIL ADDRESS DELETED]> さんは書きました:
>>>       
>>>> こんにちは、橋本と申します。
>>>>
>>>> 大谷さん、@PageScopeの不具合に対応していただきましてありがとうございます。
>>>> 結果を楽しみにTeeda 1.0.11-RC1で動作を確認してみました。
>>>> ※Seasar2 2.4.17との併用です
>>>>
>>>> そこでいくつか気がついた点があります。
>>>> 質問の前提コードは下記の通りです。
>>>>
>>>> public class TestPage {
>>>> @PageScope
>>>> public String pageField;
>>>>
>>>> @SubapplicationScope
>>>> public String subAppField;
>>>>
>>>> public Class initialize() {
>>>> pageField = "pageField";
>>>> subAppField = "subAppField";
>>>> return null;
>>>> }
>>>>
>>>> public Class prerender() {
>>>> System.out.println("prerender pageFiled=" + pageField);
>>>> System.out.println("prerender subAppField=" + subAppField);
>>>> return null;
>>>> }
>>>>
>>>> public void doUpdate() {
>>>> System.out.println("doUpdate pageFiled=" + pageField);
>>>> System.out.println("doUpdate subAppField=" + subAppField);
>>>> }
>>>> }
>>>>
>>>> <form id="Form">
>>>> <input type="submit" id="doUpdate"/>
>>>> </form>
>>>>
>>>> 上記のコードで
>>>> 1.
>>>> とりあえず画面を表示する。
>>>> ログとして下記の表示が出力
>>>> prerender pageFiled=pageField
>>>> prerender subAppField=subAppField
>>>>
>>>> 2.
>>>> ボタンでsubmitする
>>>> ログとして下記の表示が出力
>>>> doUpdate pageFiled=null
>>>> doUpdate subAppField=null
>>>> prerender pageFiled=pageField
>>>> prerender subAppField=null
>>>>
>>>> ここで2つの疑問がわきます。
>>>> 疑問1
>>>> @SubapplicationScopeの値の引継ぎが失敗しているのでは?
>>>>
>>>> 疑問2
>>>> @PageScopeの値の復旧はprerender時には行われていますが、doXXXのイベント発
>>>> 生に間に合うタイミングで行われないのでしょうか?
>>>>
>>>> 要望としてはdoXXX実行時に間に合うタイミングで復旧する事を希望いたします。
>>>> 実際はJSFコンポーネントがPageクラスのgetter/setterを利用し始める前でしょ
>>>> うか・・・
>>>> JSFに明るくないため中途半端な技術要望ですみません。
>>>> ※1.0.10の@SubapplicationScopeはそのようなタイミングで動作しているように
>>>> 思えます。
>>>>
>>>> 以上、ご検討よろしくお願いします。
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>
>>>>         
>>> --
>>> =============================
>>> Shinpei Ohtani
>>> [E-MAIL ADDRESS DELETED]
>>> =============================
>>>
>>>       
>> --
>> =============================
>> Shinpei Ohtani
>> [E-MAIL ADDRESS DELETED]
>> =============================
>>
>>     
>
>
>   




Seasar-user メーリングリストの案内