【问题标题】:Setting up @RequestBody when sending a JSON-body containing object of object and arrays在发送包含对象和数组对象的 JSON 正文时设置 @RequestBody
【发布时间】:2017-07-05 08:25:44
【问题描述】:

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

{  
   "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"
      }
   ]
}

前端后期调用:

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

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

HolderWrapper.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 +
                '}';
    }
}

ReportAccessCustom.java

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;
    }
}

以及处理 POST 请求的代码:

@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;
    }

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

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.tn.reportaccess.ReportAccessCustom

任何关于为什么失败的帮助将不胜感激。

【问题讨论】:

  • 你为什么不把你的参数定义为HolderWrapper holderWrapper
  • @Thomas @RequestBody HolderWrapper holderWrapper 你的意思是?我试过以NullPointerException结尾。那我应该如何为对象前端建模呢?

标签: java json spring hibernate post


【解决方案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) {
   ....
}

【讨论】:

  • 我的实际代码没有那些额外的大括号。这是写问题时的格式错误。不过很好抓。当我直接使用HolderWrapper 时,我得到一个NullPointerException。但如果我这样做,我应该如何更改我的对象前端?
  • 什么时候获得 NPE?请显示踪迹。你用的是什么春季版本?请同时显示您的配置
  • 如果我直接使用HolderWrapper ,当我使用来自HolderWrapper 实例的getters 时,我会得到一个NullPointerException。但是如果确实直接使用它。我从前端发送的对象看起来如何? Springer 版本为1.5.4.RELEASE
  • 您的有效载荷看起来不错。它应该与您的豆子相匹配。您是以 json 格式还是以 urlenconded 格式发送您的 javascript 对象?
  • 我直接使用HolderWrapper :) 我所要做的就是:JSON.stringify(holderWrapper) 在我的前端通话后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2015-06-11
  • 2021-09-22
相关资源
最近更新 更多