[Seasar-user:7347] Re: [Teeda] ForEach が含まれるページのリクエストパラメータの挙動について

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 4月 19日 (木) 13:55:28 JST


後藤(goto)です。

もうひとつForEachの不具合と思われる現象があったため、こちらに追加します。

添付のサンプルで
foreach.html?foo=AAA&bar=BBB
としたり、foreachConfirm.htmlでfoo、barに値を入れてgoXXX、 doXXXをすると、
ForEachより上のプロパティに関しては期待値が正しく表示されますが、
ForEachより下のプロパティは直前のForEachの値、ここではそれぞれ
a3、b3が表示されてしまいます。

org.seasar.teeda.extension.render.TForEachRendererを
添付のパッチのように修正するとForEachより下のプロパティも期待値が
正しく表示されました。

こちらに関しても不具合であれば対応をよろしくお願いします。


07/04/18 に O.Goto<[E-MAIL ADDRESS DELETED]> さんは書きました:
> 後藤(goto)です。
>
> Teeda ExtensionのForEachが含まれるページで期待しているのとは違う挙動をしているため、
> もし不具合であれば対応をお願いします。
>
> 環境は、
> JavaSE 5.0 Update 11
> Tomcat 5.5.23
> S2.4.11
> Teeda 1.0.6
> です。
>
> 現象としては、PageにForEachで表示するためのDTO配列があり、DTOに含まれる
> プロパティと同じ名前のプロパティがPageにも存在する場合、そのパラメータが
> リクエストパラメータとしてsubmitされてもPageのプロパティにはNULLが
> セットされてしまうというものです。
>
> 添付したサンプルをTeeda-html-exampleに置き換えて動かすと再現します。
>
> foreach.htmlを表示し、foo、barに適当な値を入力してgoXXX、 doXXXボタンを押すと
> いずれもfoo、bar(id はそれぞれ foo-text bar-text)が空になります。
> 自画面への遷移でも他画面への遷移でも変わりありません。
>
> どうやら
> org.seasar.teeda.extension.component.TForEach#processUpdates()
> に入ってきたときはPageに値がセットされているのですが、
> DTO配列に存在するプロパティ名と同じプロパティの場合、最終的にNULLが
> セットされてしまうようです。
>
> そこで、添付したパッチのようにしてみたところリクエストパラメータがNULLになることなく
> 画面にも表示されました。
>
> そもそもこの現象は不具合なのか仕様なのかわからないため、もし不具合であれば
> 修正をお願いします。
>
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
>
>
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: teeda-html-example.zip
型:         application/zip
サイズ:     4360 バイト
説明:       無し
URL:        http://ml.seasar.org/archives/seasar-user/attachments/20070419/eea19a91/attachment.zip 
-------------- next part --------------
Index: C:/Documents and Settings/goto/My Documents/eclipse/workspace/teeda-1.0.6/teeda-extension/src/main/java/org/seasar/teeda/extension/render/TForEachRenderer.java
===================================================================
--- C:/Documents and Settings/goto/My Documents/eclipse/workspace/teeda-1.0.6/teeda-extension/src/main/java/org/seasar/teeda/extension/render/TForEachRenderer.java	(revision 3039)
+++ C:/Documents and Settings/goto/My Documents/eclipse/workspace/teeda-1.0.6/teeda-extension/src/main/java/org/seasar/teeda/extension/render/TForEachRenderer.java	(working copy)
@@ -25,6 +25,8 @@
 
 import org.seasar.framework.beans.BeanDesc;
 import org.seasar.framework.beans.factory.BeanDescFactory;
+import org.seasar.framework.beans.util.BeanUtil;
+import org.seasar.framework.util.ClassUtil;
 import org.seasar.teeda.core.render.AbstractRenderer;
 import org.seasar.teeda.extension.component.TForEach;
 import org.seasar.teeda.extension.util.AdjustValueHolderUtil;
@@ -47,6 +49,8 @@
         }
         final TForEach forEach = (TForEach) component;
         final Object page = forEach.getPage(context);
+        final Object pageClone = ClassUtil.newInstance(page.getClass());
+        BeanUtil.copyProperties(page, pageClone);
         final BeanDesc pageBeanDesc = BeanDescFactory.getBeanDesc(page
                 .getClass());
         final Object[] items = forEach.getItems(context);
@@ -64,6 +68,7 @@
             super.encodeChildren(context, component);
             forEach.leaveRow(context);
         }
+        BeanUtil.copyProperties(pageClone, page);
     }
 
     public void decode(FacesContext context, UIComponent component) {


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