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

标签 java json spring hibernate post

发送到后端的 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

任何有关此失败原因的帮助将不胜感激。

最佳答案

您的负载中存在拼写错误。它有一个用于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) {
   ....
}

关于java - 发送包含对象和数组的对象的 JSON 主体时设置 @RequestBody,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44920779/

相关文章:

java - 如何有效地从 Spring Data JPA 的 findAllById 方法中知道丢失的项目?

Java 不会在不包含 main 的不同类中打印

java - 没有 Eclipse 的 OSGi 教程?

java - 如何用Java从txt文件中读取JSON数据?

python - 如何将提取的数据转换成python字典?

python - Flask JSON 序列化错误,因为 flask babel

java - Spring中servlet被销毁时如何捕获Configuration类中的回调?

java - 使用 @JsonProperty 注释的 json 模型反序列化使用构建器模式更改了属性

java - 使用哪个版本的 AES?

java - 在 Spring Boot 中使用 RestTemplate 时,Long 值始终为 null