我需要从前端到后端发送自定义对象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
解组和绑定对象。
答案 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"
]
}
}