如何在Spring MVC中将String转换为List对象

时间:2012-01-11 21:04:48

标签: spring-mvc

我正在尝试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。即使我不知道这是否是正确的做法。

1 个答案:

答案 0 :(得分:1)

如上所述,您尝试使用单个文本字段表示极其复杂的类型(List Map s)。您的第一步应该是如何在Web表单中显示该信息。然后尝试使用“预制数据”(例如,您使用假TestBean加载的books)并查看您的表单是否符合预期。

如果您更改books集合的存储方式,您可能会觉得更容易。在允许时将这种复杂类型作为“bean”的一部分,可能不是推荐。考虑使用List<BookBean>,其中BookBean包含BookDetailBean的集合,而BookDetailBean包含您之前在Map中拥有的字符串到字符串关系}。