0
votes

I'm trying to pass a Map< String, String> to Spring via Ajax using @ModelAttribute notation. With IntelliJ's REST client, I just have to add the "infos[KEY]" param with value "VALUE" to get the corresponding key/value couple populated in the hashmap.

I'm trying to reproduce the same behaviour with JQuery

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

But Spring controller can't get to populate my model. Here it is (but i shouldn't be the problem because as I said IntelliJ's REST client works fine)

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;
    }
}

Here's my controller's method:

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

2 Answers

2
votes

String modelAttribute doesn't receive the data the way you sent it (json object).

EDIT

The easiest way for you should be to the following:

AJAX:

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

CONTROLLER:

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

Well using this controller

//Just an example

   @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;
        } 

The thing here is as the other previously mentioned you need to send the object for ExtraInfos.

If we suppose that this is an example value for ExtraInfos

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

Our mapper will create the ExtraInfos object with it.

Doing this ajax call (in this case for this mapper).

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

Output on the console:

23123
{key=value}