1

スレッドは、sending-data-back-to-controller-spring-mvc の継続中です

ユーザーにいくつかのオプションを表示する必要がある製品詳細ページに取り組んでおり、ユーザーはそれらのいくつかを選択し、送信ボタンで製品をバスケットに追加する必要があります。私の意図は、そのデータオブジェクトをカートコントローラーに転送して、それらの値を使用できるようにすることです。オブジェクトには動的な値が含まれているため、事前に決定されたフィールドオブジェクトを定義することはできません。これは私のデータオブジェクトです

public class PrsData {
    private Map<String, List<PrsCDData>> prsCDData;

    public PrsData(){
        this.prsCDData = MapUtils.lazyMap(new HashMap<String, List<PrsCDData>>(),
        FactoryUtils.instantiateFactory(PrsCDData.class));
    }
} 

public class PrsCDData {
    private Map<String, List<ConfiguredDesignData>> configuredDesignData;
    // same lazy map initialization
}

私の製品詳細ページコントローラーでは、値を次のように設定しています。

model.addAttribute("prsData", productData.getPrsData());

私の製品詳細ページJSPには、これが私のフォームにあります:

<form:form method="post" commandName="prsData" action="${addProductToCartAction}" >
    <form:hidden path="prsCDData[''${prsCDDataMap.key}'']
                    [${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
                    [${configuredDesignDataStatus.index}].code" />
</form:form>

しかし、送信ボタンをクリックすると、次の例外が発生します

org.springframework.beans.InvalidPropertyException: 
    Invalid property 'prsCDData['Forced'][0]' of bean class [com.product.data.PrsData]: 
        Property referenced in indexed property path 'prsCDData['Forced'][0]' 
        is neither an array nor a List nor a Set nor a Map; 
        returned value was [com.product.data.PrsCDData@6164f07e]

製品詳細ページでこれらの非表示フィールドが正しくバインドされ、偶数の値が割り当てられているため、どこで間違っているのかわかりませんが、フォームが送信されると、この問題に直面しています。

4

1 に答える 1

1

LazyMapファクトリはLazyListを返す必要があります。

指定されたファクトリFactoryUtils.instantiateFactory(PrsCDData.class)は、PrsCDDataのリストではなく、新しいPrsCDDataオブジェクトを作成します。

prsCDData['Forced'] -> if exists then return it else create instance of PrsCDData.class

する必要があります

prsCDData['Forced'] -> if exists then return it else create instance of LazyList<PrsCDData>

インデックス「0」にすぐにアクセスしたいので、LazyListを使用します。そうしないと、ArrayIndexOutOfBoundsExecptionにつながります。

編集:簡単な例

public class Test {

@SuppressWarnings("unchecked")
public static void main(String[] args) throws UnsupportedEncodingException {

    Map<String, List<SimpleBean>> map = MapUtils.lazyMap(new HashMap<String,List<Object>>(),new Factory() {

        public Object create() {
            return LazyList.decorate(new ArrayList<SimpleBean>(), FactoryUtils.instantiateFactory(SimpleBean.class));
        }
    });

    System.out.println(map.get("test").get(0));
}

public static class SimpleBean {
    private String name;
}

}
于 2012-09-10T14:19:50.210 に答える