发送包含对象和数组对象的JSON主体时设置@RequestBody

时间:2017-07-05 08:25:45

标签: java json spring hibernate post

发送到后端的我的json对象如下所示:

$relation = ModelObject::where('status', '=', 1)
->with(['related_table' => function($query) {
        $query->orderBy('field', 'asc|desc');
}])
->get()

前端电话:

{  
   "reportAccess":{  
      "report":{  
         "id":70,
         "reportName":"Test Rapport",
         "created":"2017-06-01",
         "description":"Test report",
         "modifiedDate":"2017-06-01T12:10:00.000+0000",
         "modifiedBy":"111111"
      },
      "accessGroup":{  
         "id":1,
         "accessName":"Administrator"
      },
      "validFromDate":"2017-07-24",
      "validToDate":"2017-07-30"
   },
   "users":[  
      {  
         "id":111111,
         "employeeNumber":"123456",
         "firstName":"Test1",
         "lastName":"Test11",
         "windowsId":"t1234567"
      },
      {  
         "id":222222,
         "employeeNumber":"7891011",
         "firstName":"Test2",
         "lastName":"Test22",
         "windowsId":"t7891011"
      }
   ]
}

后端,我有一个包装器,看起来像这样:

HolderWrapper.java

function addAccessForMultipleAgents(access, users) {
            var holderWrapper = {
                reportAccess: access,
                users: users
            };
            return utils.post('/api/v1/reportAccesses/all', holderWrapper);
        }

ReportAccessCustom.java

public class HolderWrapper {
    private List<User> users;
    private ReportAccessCustom reportAccess;

    public HolderWrapper() {
    }

    public HolderWrapper(List<User> users, ReportAccessCustom reportAccess) {
        this.users = users;
        this.reportAccess = reportAccess;
    }

    public List<User> getUsers() {
        return users;
    }

    public ReportAccessCustom getReportAccess() {
        return reportAccess;
    }

    @Override
    public String toString() {
        return "HolderWrapper{" +
                "users=" + users +
                ", reportAccess=" + reportAccess +
                '}';
    }
}

处理POST请求的代码:

public class ReportAccessCustom {
    private Report report;
    private AccessGroup accessGroup;
    private Date validFromDate;
    private Date validToDate;

    public Report getReport() {
        return report;
    }

    public AccessGroup getAccessGroup() {
        return accessGroup;
    }

    public Date getValidFromDate() {
        return validFromDate;
    }

    public Date getValidToDate() {
        return validToDate;
    }
}

这一切都给我留下了错误信息:

@RequestMapping(value = "", method = RequestMethod.POST)
    public List<ReportAccess> createMultipleAccesses(@RequestBody Map<String, Object> holderWrapper) {
        List<ReportAccess> response = new ArrayList<>();

        HolderWrapper hw = new HolderWrapper((ArrayList<User>) holderWrapper.get("users"), (ReportAccessCustom) holderWrapper.get("reportAccess"));
        List<User> users = hw.getUsers();
        ReportAccessCustom reportAccessCustom = hw.getReportAccess();


      //rest of code..
        return response;
    }

任何帮助,为什么这种失败将非常感激。

1 个答案:

答案 0 :(得分:1)

您的有效负载中存在拼写错误。它有一个用于reportAccess的双{

{
    "reportAccess": {
        {                 <--- REMOVE THIS AND ...
          "report": {
            "id": 70,
            ...
          },
          "accessGroup": {
            "id": 1,
            ...
          },
          "validFromDate": "2017-07-24",
          "validToDate": "2017-07-30"
        }                <--- ... THIS ONE TOO
    },
    "users": [
        {
            "id": 111111,
            ...
        },
        {
            "id": 222222,
            ...
        }
    ]
}

顺便说一句,您不需要为您的请求体使用Map,您可以直接使用HolderWrapper:

@RequestMapping(value = "", method = RequestMethod.POST)
    public List<ReportAccess> createMultipleAccesses(@RequestBody HolderWrapper holderWrapper) {
   ....
}