java – 绑定Spring MVC中的列表映射
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 绑定Spring MVC中的列表映射,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4040字,纯文字阅读大概需要6分钟。
内容图文
![java – 绑定Spring MVC中的列表映射](/upload/InfoBanner/zyjiaocheng/706/743fe020443140e79a3534479f133292.jpg)
我不确定这是否是一个复杂的问题,但作为一个初学者,这对我来说似乎有点复杂.
我有一个对象,我需要在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表达不正确
解决方法:
说明:如果在您的控制器中您拥有@ModelAttribute(“user”)用户用户,并且您加载了包含< form:form commandName =“user”>的相应页面,则会实例化一个空用户.
它的所有属性都为null,如果是List或Map,则为空.此外,它的空列表/映射已经使用自动增长实现进行了实例化.这是什么意思 ?假设我们有一个空的自动增长列表< Coconut>椰子.如果我执行coconuts.get(someIndex).setDiameter(50),它将工作而不是抛出异常,因为列表自动增长并实例化给定索引的椰子.
由于这种自动增长功能,使用以下输入提交表单将像魅力一样:
<form:input path="coconuts[${someIndex}].diameter" />
现在回到你的问题:Spring MVC自动增长对一组对象很有效,每个对象都包含一个map / list(see this post).但是,鉴于您的异常,看起来Spring不会自动增长自动增长列表/映射包含的可能对象.在Map< String,List< PrsCDData>> prsCDData,List< PrsCDData>是一个没有自动增长的空列表,因此导致您的例外.
所以解决方案必须使用某种Apache Common的LazyList或Spring的AutoPopulatingList.
您必须实现自己的自动增长映射,该映射为给定索引实例化LazyList / AutoPopulatingList.从头开始或使用某种Apache Common的LazyMap/MapUtils.lazyMap实现(到目前为止,我还没有找到LazyMap的Spring等价物).
解决方案示例,使用Apache Commons Collections:
public class PrsData {
private Map<String, List<PrsCDData>> prsCDData;
public PrsData() {
this.prsCDData = MapUtils.lazyMap(new HashMap<String,List<Object>>(), new Factory() {
public Object create() {
return LazyList.decorate(new ArrayList<PrsCDData>(),
FactoryUtils.instantiateFactory(PrsCDData.class));
}
});
}
}
内容总结
以上是互联网集市为您收集整理的java – 绑定Spring MVC中的列表映射全部内容,希望文章能够帮你解决java – 绑定Spring MVC中的列表映射所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。