如何使用JSON中的@RequestBody绑定自定义对象的映射

时间:2014-06-11 14:53:00

标签: java json spring-mvc jackson

我需要从前端到后端发送自定义对象Map<String, Set<Result>>的地图。

所以我认为应该可以构建JSON,通过Ajax将它发送到Controller并通过@RequestBody注释在Controller中接收它,它应该将json绑定到object。正确?

控制器:

@RequestMapping(value = "/downloadReport", method = RequestMethod.POST)
public ResponseEntity<byte[]> getReport(@RequestBody Map<String, Set<Result>> resultMap) 
{
    Context context = new Context();
    context.setVariable("resultMap", resultMap);
    return createPDF("pdf-report", context);
}

JSON:

{
  "result": [
    {
      "id": 1,
      "item": {
        "id": 3850,
        "name": "iti"
      },
      "severity": "low",
      "code": "A-M-01",
      "row": 1,
      "column": 1,
      "description": "Miscellaneous warning"
    }
  ]
}

型号:

public class Result {
    private Integer id;
    private Item item;
    private String severity;
    private String code;
    private Integer row;
    private Integer column;
    private String description;
    //getter & setters
    //hashCode & equals
}
public class Item {
    private Integer id;
    private String name;
    //getter & setters
}

通过ajax发送如上所述的JSON后,我收到来自浏览器的错误消息:

The request sent by the client was syntactically incorrect

如果我更改JSON以发送如下的空集,那么它可以工作但当然我的地图有空集:

{"result": []}

那么,为什么我无法接收带有一组对象的填充地图?为什么绑定/解组不能按预期工作,我应该做些什么来使其工作?

注意: 我正在使用杰克逊库和编组用于@ResponseBody的其他案例工作正常。问题在于通过@RequestBody解组和绑定对象。

2 个答案:

答案 0 :(得分:1)

为了让jackson正确反序列化您的自定义类,您需要提供@JsonCreator带注释的构造函数,该构造函数遵循java doc中定义的规则之一。因此,对于您的Item课程,它可能如下所示:

@JsonCreator
public Item(@JsonProperty("id") Integer id,
            @JsonProperty("name") String name) {
    this.id = id;
    this.name = name;
}

答案 1 :(得分:1)

你必须以不同方式处理地图, 首先创建包装类

public MyWrapperClass implements Serializable {
    private static final long serialVersionUID = 1L;
    Map<String, List<String>> fil = new HashMap<String, List<String>>();
    // getters and setters
    }

然后你应该在控制器中接受请求,

@PostMapping
    public Map<String,List<String>> get(@RequestBody Filter filter){
    System.out.println(filter);
    }

Json Request应该像

{  
       "fil":{  
          "key":[  
             "value1",
             "value2"
          ],
          "key":[  
             "vakue1"
          ]
       }
    }