[Seasar-user:17563] SAStrutsでNestedのiterateタグの使用

Nishiwaki Kiyoyuki [E-MAIL ADDRESS DELETED]
2009年 6月 1日 (月) 08:46:11 JST


SAStruts関係者のみなさま

西腋と申します。

SAStruts 1.0.4-sp5 を使用してWebアプリケーションを作成した際
FromにDTOをListで複数件持てるようにし、複数件の入力を行えるようにしてます。
この際、JSPにStrutsのNestedのiterateタグなどを利用すると例外が発生します。

org.seasar.struts.action.ActionFormWrapper
org.seasar.struts.action.WrapperUtil
の2つのソースを修正すると、正常に画面が表示され、複数件の入力も可能でした。

プロジェクトではiterateタグの利用頻度が高いため、SAStrutsを修正して利用した
いと思っているのですが
修正案として問題がないか意見を聞かせていただきたいと思っております。
よろしくお願いいたします。



発生する例外は以下のようなものです。

java.lang.UnsupportedOperationException: get

org.seasar.struts.action.ActionFormWrapper.get(ActionFormWrapper.java:109)

org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUt
ilsBean.java:386)

org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUt
ilsBean.java:340)

org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUti
lsBean.java:664)

org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean
.java:715)

org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:29
0)
	org.apache.struts.taglib.TagUtils.lookup(TagUtils.java:951)

org.apache.struts.taglib.TagUtils.computeParameters(TagUtils.java:188)
	org.apache.struts.taglib.html.LinkTag.calculateURL(LinkTag.java:440)
	org.apache.struts.taglib.html.LinkTag.doStartTag(LinkTag.java:341)

org.apache.struts.taglib.nested.html.NestedLinkTag.doStartTag(NestedLinkTag.
java:74)

ソースを見ますと、org.seasar.struts.action.ActionFormWrapperのget(String
name, int index)が未実装でしたので
以下のようなコードを追加しみました。

    public Object get(String name, int index) {

        S2DynaProperty property = getProperty(name);
        Object value = property.getValue(actionForm);

        if (value == null) {
            throw new NullPointerException
                ("No indexed value for '" + name + "[" + index + "]'");
        } else if (value.getClass().isArray()) {
            return (Array.get(value, index));
        } else if (value instanceof List) {
            return ((List) value).get(index);
        } else {
            throw new IllegalArgumentException
                ("Non-indexed property for '" + name + "[" + index + "]'");
        }

    }

そうしますと、次に以下のような例外が発生しました。
原因は、org.seasar.struts.action.WrapperUtilでFromがBeanWrapperでラッパーさ
れ、
FormがMapインタフェースを実装しているように見えていますが
Formには配列のgetter,setterを用意しています。
TestDto42[] getTestDto42Array()
void setTestDto42Array(TestDto42[] values)
ですので、Mapのつもりで呼び出して失敗しています。

org.seasar.framework.beans.PropertyNotFoundRuntimeException: [ESSR0065]クラ
ス(test.dto.sample.TestDto41)のプロパティ(testDto42Array[0])が見つかりません

org.seasar.framework.beans.impl.BeanDescImpl.getPropertyDesc(BeanDescImpl.ja
va:137)
	org.seasar.struts.action.BeanWrapper.get(BeanWrapper.java:58)

org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUti
lsBean.java:660)

org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean
.java:715)

org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:29
0)
	org.apache.struts.taglib.TagUtils.lookup(TagUtils.java:951)

org.apache.struts.taglib.TagUtils.computeParameters(TagUtils.java:188)
	org.apache.struts.taglib.html.LinkTag.calculateURL(LinkTag.java:440)
	org.apache.struts.taglib.html.LinkTag.doStartTag(LinkTag.java:341)

org.apache.struts.taglib.nested.html.NestedLinkTag.doStartTag(NestedLinkTag.
java:74)

そこで、WrapperUtilでFormをBeanWrapperでラッパーするのを暫定的にやめると正常
に画面が表示されます。
暫定的対応なので、本来はFormがMapに対応したgetter,setterを持つか否かで
BeanWrapperでラップするか否かを判断するなどの処理が必要かと思っています。
-------------- next part --------------
A non-text attachment was scrubbed...
Name: iterate-test.zip
Type: application/x-zip-compressed
Size: 32075 bytes
Desc: 無し
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20090601/668c2f0f/attachment.bin>


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