我试图从ajax发送HashMap或任何其他Map实现到
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
我究竟做错了什么 ?
谢谢.
在弹簧控制器中绑定地图的方式与绑定数组的方式相同.无需特殊转换器!
原文链接:https://www.f2er.com/springmvc/159957.html但有一点要记住:
> Spring使用命令对象作为顶级值持有者.命令对象可以是任何类.
所以你需要的是一个包装类(TagsWrapper),它包含一个Map< String,String>类型的字段.叫做标签.
绑定数组的方法相同.
这在文档中得到了很好的解释,但我偶尔忘记了包装器对象的需要;)
您需要更改的第二件事是提交标记值的方式:
>每个地图键使用一个表单参数,而不是完整映射的完整字符串表示.
>一个输入值应如下所示:
<input type="text" name="tags[key]" value="something">
如果标签是包装器中的映射,则这样就可以开箱即用于表单提交.