美文网首页
(@RequestBody Map map)接收多种类型参数

(@RequestBody Map map)接收多种类型参数

作者: 墨色尘埃 | 来源:发表于2019-05-20 17:13 被阅读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");
    

    相关文章

      网友评论

          本文标题:(@RequestBody Map map)接收多种类型参数

          本文链接:https://www.haomeiwen.com/subject/stakzqtx.html