(@RequestBody Map map)接收多种类型参数
2019-05-20 本文已影响0人
墨色尘埃
POST方式接收
这种方式参数的范围广,比如传入的参数不好定义时可以使用。
json串里有数组、及其他一些字段。
{
"ids": [
1130300079678365700,
1126444579401408500,
1122018665301971000
],
"size": 20,
"current": 1,
"subjectType": 1101,
"subjectid": 1120946621235015700
}
image.png
比如size和current两个参数
这些参数本来可以用(@RequestBody Page page)接收
- 这里可以利用反射将其转成Page
Page page = (Page) MapBeanUtil.mapToBean(map, Page.class);
- 因为确定了Page里有size和current两个参数,也可以map.get()方法取值然后setter
Page page = new Page();
page.setSize((Integer) map.get("size"));
page.setSize((Integer) map.get("current"));
比如subjectType和subjectid等参数
这些参数本来可以用 (@RequestBody AuthEnroll authEnroll) 接收,但是因为 ids 参数以及 size 和 current 参数不属于 AuthEnroll 对象,难道要用(@RequestBody AuthEnroll authEnroll, @RequestBody Map map, @RequestBody Page page)
接收吗?
很不幸,这种方式是错误的,报错信息如下:
关于这种错误,有【解决RequestBody获取数据报Stream closed】 解决方式。
{
"timestamp": "2019-05-20 16:58:47",
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "I/O error while reading input message; nested exception is java.io.IOException: Stream closed",
"path": "/api/authEnroll/exportPhoto"
}
- 所以最好的方法还是用Map接收,然后利用反射将其转成AuthEnroll 对象。因为AuthEnroll里并没有size和page属性,所以即使map中有这两个值,转成AuthEnroll对象也不会有什么影响。
SubjectEnrollList model = (SubjectEnrollList) MapBeanUtil.mapToBean(map, SubjectEnrollList.class);
- 要么map.get()方式,如果很多的话就会显得很繁琐。
比如ids参数
这些参数本来可以用(@RequestBody List<Long> list)接收,这里使用map.get()方式获取。
List<Long> list = (List<Long>) map.get("ids");