通过地图 到springMVC控制器


问题内容

我试图将HashMap或任何其他Map实现从Ajax发送到Spring MVC控制器

这是我的操作方法的详细信息:

Ajax调用如下

var tags = {};
tags["foo"] = "bar";
tags["whee"] = "whizzz";


$.post("doTestMap.do",   {"tags" : tags }, function(data, textStatus, jqXHR) {
if (textStatus == 'success') {
    //handle success
    console.log("doTest returned " + data);
} else {
    console.err("doTest returned " + data);
}
});

然后在控制器端,我有:

@RequestMapping(value="/publisher/doTestMap.do", method=RequestMethod.POST)
public @ResponseBody String doTestMap(@RequestParam(value = "tags", defaultValue = "") HashMap<String,String> tags, HttpServletRequest request) {  //

    System.out.println(tags);

    return "cool";
}

不幸的是我系统地得到了

org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Map'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Map]: no matching editors or conversion strategy found

我究竟做错了什么 ?

谢谢。


问题答案:

在spring控制器中绑定映射的支持方式与绑定数组相同。无需特殊转换器!

但是要记住一件事:

  • Spring 使用 命令 对象作为顶级值持有者。命令对象可以是任何类。

因此,您所需要的只是一个包装器类(TagsWrapper),其中包含一个Map<String, String>称为标签的类型的字段。绑定数组的方法相同。

在文档中对此进行了很好的解释,但是我不时忘记了包装对象的需要;)

您需要更改的第二件事是提交标签值的方式:

  • 每个地图关键字使用一个表单参数,而不是完整地图的完整字符串表示。
  • 一个输入值应如下所示:
      <input type="text" name="tags[key]" value="something">
    

如果标签是包装器中的地图,则对于表单提交来说,它是开箱即用的。