我正在尝试Spring MVC示例。我有一个testBean,它有List类型变量,如
private List<HashMap<String, String>> books;
在我的控制器中我有
@RequestMapping(value = "/booksList", method = RequestMethod.POST)
public String displayBooks(@ModelAttribute TestBean testBean, Model model, HttpSession session) {
// some code here
}
在我的jsp页面中,我有
<form:form action="booksList.html" method="post" modelAttribute="testBean">
<form:hidden path="books" />
<input type="submit" value="submit">
</form:form>
当我提交此表单时,我收到此错误
无法将类型[
java.lang.String
]的值转换为属性“java.util.HashMap
”所需的类型[books[0]
]。
如何解决此错误?请帮忙
更新
I have seen that我也可以这样做。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(List.class, "testBean", new CustomCollectionEditor(List.class) {
@Override
protected Object convertElement(Object element) {
TestBean testBean = new TestBean();
if (element != null) {
List<HashMap<String, String>> id = (List<HashMap<String, String>>) element;
testBean.setFilters(id);
}
return testBean;
}
});
}
但我完全不理解上述方法可能会出现一些错误。而且我不知道如何以及从哪里可以调用convertElement(Object element)
方法。我明白initBinder(WebDataBinder binder)
会在我的控制器方法public String displayBooks(...)
之前调用jsut。即使我不知道这是否是正确的做法。
答案 0 :(得分:1)
如上所述,您尝试使用单个文本字段表示极其复杂的类型(List
Map
s)。您的第一步应该是如何在Web表单中显示该信息。然后尝试使用“预制数据”(例如,您使用假TestBean
加载的books
)并查看您的表单是否符合预期。
如果您更改books
集合的存储方式,您可能会觉得更容易。在允许时将这种复杂类型作为“bean”的一部分,可能不是推荐。考虑使用List<BookBean>
,其中BookBean
包含BookDetailBean
的集合,而BookDetailBean
包含您之前在Map
中拥有的字符串到字符串关系}。