(@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)接收

  1. 这里可以利用反射将其转成Page
Page page = (Page) MapBeanUtil.mapToBean(map, Page.class);
  1. 因为确定了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"
}
  1. 所以最好的方法还是用Map接收,然后利用反射将其转成AuthEnroll 对象。因为AuthEnroll里并没有size和page属性,所以即使map中有这两个值,转成AuthEnroll对象也不会有什么影响。
SubjectEnrollList model = (SubjectEnrollList) MapBeanUtil.mapToBean(map, SubjectEnrollList.class);
  1. 要么map.get()方式,如果很多的话就会显得很繁琐。
比如ids参数

这些参数本来可以用(@RequestBody List<Long> list)接收,这里使用map.get()方式获取。

List<Long> list = (List<Long>) map.get("ids");
上一篇下一篇

猜你喜欢

热点阅读