带参数的JQuery AJAX奇怪行为(Spring' @ModelAttribute)

时间:2014-03-17 20:21:53

标签: jquery ajax spring modelattribute

我试图传递一张地图<字符串,字符串>使用@ModelAttribute表示法通过Ajax传递给Spring。 使用IntelliJ的REST客户端,我只需要添加" infos [KEY]"有价值的参数" VALUE"获取在hashmap中填充的相应键/值对。

我试图用JQuery重现相同的行为

function update()
{
     $.ajax(
          {
            type: "PATCH",
            url: "url",
            dataType: "json",
            data: {"infos[TheAnswer]": "42"},
            success: function(data)
              {
                alert("OK");
              }
          });
}

但Spring控制器无法填充我的模型。 这是(但我不应该成为问题因为我说IntelliJ的REST客户端工作正常)

public class ExtraInfos implements Serializable
{
    protected HashMap<String, String> infos = new HashMap<String, String>();

    public HashMap<String, String> getInfos()
    {
        return infos;
    }

    public void setInfos(HashMap<String, String> infos)
    {
        this.infos = infos;
    }
}

这是我的控制器方法:

@RequestMapping(value = "/{id}", method = RequestMethod.PATCH)
public
@ResponseBody
Contact updateContact(@PathVariable("id") Long id,
                      @ModelAttribute ExtraInfos infos)
{
    return this.service.update(id, infos);
 }

2 个答案:

答案 0 :(得分:2)

字符串modelAttribute没有按照发送方式接收数据(json对象)。

修改

最简单的方法应该是:

AJAX:

$.ajax(
          {
            type: "PATCH",
            url: "url",
            dataType: "json",
            data: {TheAnswer: "42"},
            success: function(data)
              {
                alert("OK");
              }
          });

控制器:

public @ResponseBody Contact updateContact(@PathVariable("id") Long id,
                          @RequestBody ExtraInfos infos){
        }

答案 1 :(得分:-1)

好好使用这个控制器

//只是一个例子

   @RequestMapping(value = "/test/{id}", method = RequestMethod.POST)
    public @ResponseBody Integer extra(@PathVariable("id") Long id, @RequestBody ExtraInfos extraInfos){
            System.out.println(id);
            System.out.println(extraInfos.getInfos());

            return 1;
        } 

这里的事情就像前面提到的那个你需要为ExtraInfos发送对象。

如果我们假设这是ExtraInfos的示例值

ExtraInfos = {infos:{"key":"value"}}

我们的mapper将使用它创建ExtraInfos对象。

执行此ajax调用(在本例中为此映射器)。

$.ajax({
    url:"test/23123",
    type:"post",
    contentType: "application/json; charset=utf-8",
    data:JSON.stringify(ExtraInfos)
})

控制台上的输出:

23123
{key=value}