これが複雑な問題かどうかはわかりませんが、初心者としては少し複雑に思えます。UIにいくつかの値を表示し、ユーザーがそれらのいくつかを選択できるようにする必要があるオブジェクトがあり、ユーザーが送信ボタンをクリックしたときにデータを別のコントローラーに送り返す必要があります。データオブジェクトの構造は次のとおりです
public class PrsData{
private Map<String, List<PrsCDData>> prsCDData;
}
public class PrsCDData{
private Map<String, Collection<ConfiguredDesignData>> configuredDesignData;
}
public ConfiguredDesignData{
// simple fields
}
ビューを次のように表示する前に、モデルにオブジェクトを設定しました
model.addAttribute("prsData", productData.getPrData());
フォームには次の設定があります
<form:form method="post" commandName="prsData" action="${addProductToCartAction}" >
<form:hidden path="prsCDData['${prsCDDataMap.key}']
[${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
[${configuredDesignDataStatus.index}].code"/>
<form:hidden path="prsCDData['${prsCDDataMap.key}']
[${status.index}].configuredDesignData['${configuredDesignDataMap.key}']
[${configuredDesignDataStatus.index}].description"/>
</form:form>
これは私が持っているものですAddProductToCartController
public String addToCart(@RequestParam("productCodePost") final String code,
@ModelAttribute("prsData") final PrsData prsData, final Model model,
@RequestParam(value = "qty", required = false, defaultValue = "1") final long qty)
フォームを送信すると、次の例外が発生します
org.springframework.beans.NullValueInNestedPathException: Invalid property 'prsCDData[Forced][0]'
of bean class [com.product.data.PrsData]:
Cannot access indexed value of property referenced in indexed property path 'prsCDData[Forced][0]': returned null
そのコントローラーに値を送信しようとしていて、選択した値で同じオブジェクトを作成しようとしているときに、このコントローラーの値にアクセスしようとしているようです
どこが間違っているのか、何を世話する必要があるのか 教えてもらえますか
編集
さらに調査を行ったところ、Spring はカスタム オブジェクトのリスト/マップの自動入力をサポートしていないことがわかりました。その答えに基づいて、実装を次のように変更しようとしました。
public class PrsData{
private Map<String, List<PrsCDData>> prsCDData;
// lazy init
public PrsData()
{
this.prsCDData = MapUtils.lazyMap(new HashMap<String, List<PrsCDData>>(),
FactoryUtils.instantiateFactory(PrsCDData.class));
}
}
public class PrsCDData{
private Map<String, Collection<ConfiguredDesignData>> configuredDesignData;
public PrsCDData()
{
this.configuredDesignData = MapUtils.lazyMap(new HashMap<String,
List<ConfiguredDesignData>>(),
FactoryUtils.instantiateFactory(ConfiguredDesignData.class));
}
}
しかし、次の例外が発生しています
org.springframework.beans.InvalidPropertyException:
Invalid property 'prsCDData[Forced][0]' of bean class [com.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.data.PrsCDData@6043a24d]
どちらが間違っているのかわかりません.JSTL表現が正しくないようです.