是否可以使用RestTemplate提取一组数据库行?

时间:2016-11-28 21:13:52

标签: jpa spring-boot repository resttemplate

我很难通过RestTemplate从我的数据库中获取多个数据集。我有很多例程提取单行,格式如下:

IndicatorModel indicatorModel = restTemplate.getForObject(URL + id, 
IndicatorModel.class);

他们工作正常。但是,如果我尝试提取一组数据,例如:

Map<String, List<S_ServiceCoreTypeModel>> coreTypesMap = 
        restTemplate.getForObject(URL + id, Map.class);

这将返回

中的值
Map<String, LinkedHashMap<>> 

格式。是否有一种简单的方法可以返回List&lt;&gt;或设置&lt;&gt;以所需的格式?

3 个答案:

答案 0 :(得分:1)

基本上问题是您的Java对象模型与json文档的结构不匹配。您正在尝试将单个json元素反序列化为java List。您的JSON文档如下所示:

{
   "serviceCoreTypes":[
      {
         "serviceCoreType":{
            "name":"ALL",
            "description":"All",
            "dateCreated":"2016-06-23 14:46:32.09",
            "dateModified":"2016-06-23 14:46:32.09",
            "deleted":false,
            "id":1
         }
      },
      {
         "serviceCoreType":{
            "name":"HSI",
            "description":"High-speed Internet",
            "dateCreated":"2016-06-23 14:47:31.317",
            "dateModified":"2016-06-23 14:47:31.317",
            "deleted":false,
            "id":2
         }
      }
   ]
}

但是你无法将serviceCoreTypes变成List,你只能将Json数组变成List。例如,如果您从json中删除了不必要的包装元素,并且输入文档看起来像:

[
  {
    "name": "ALL",
    "description": "All",
    "dateCreated": "2016-06-23 14:46:32.09",
    "dateModified": "2016-06-23 14:46:32.09",
    "deleted": false,
    "id": 1
  },
  {
    "name": "HSI",
    "description": "High-speed Internet",
    "dateCreated": "2016-06-23 14:47:31.317",
    "dateModified": "2016-06-23 14:47:31.317",
    "deleted": false,
    "id": 2
  }
]

您应该能够将THAT反序列化为List< S_ServiceCoreTypeModel>。或者,如果您无法更改json结构,则可以创建一个Java对象模型,通过创建一些包装类来对json文档进行建模。类似的东西:

class ServiceCoreTypes {
  List<ServiceCoreType> serviceCoreTypes;
  ...
}
class ServiceCoreTypeWrapper {
  ServiceCoreType serviceCoreType;
  ...
}
class ServiceCoreType {
  String name;
  String description;
  ...
}

答案 1 :(得分:0)

我假设您实际上并不是指数据库,而是在您使用RestTemplate时提供宁静的服务

您遇到的问题是您希望获得一个Collection,但getForObject方法只能接受单个类型参数,并且无法确定返回的集合的类型。

我鼓励您考虑使用RestTemplate.exchange(...) 这应该允许您请求和接收回收类型。

答案 2 :(得分:0)

至少现在我有一个有效的解决方案。我更喜欢Ben提出的解决方案,我可以将HTTP响应体作为我选择的格式的项目列表,但至少在这里我可以从JSON节点中提取每个单独的项目。代码:

    S_ServiceCoreTypeModel endModel;
    RestTemplate restTemplate = new RestTemplate();
    JsonNode node = restTemplate.getForObject(URL, JsonNode.class);
    JsonNode allNodes = node.get("serviceCoreTypes");
    JsonNode oneNode = allNodes.get(1);
    ObjectMapper objectMapper = new ObjectMapper();
    endModel = objectMapper.readValue(oneNode.toString(), S_ServiceCoreTypeModel.class);

如果有人想过如何使Ben的解决方案有效,我很乐意听到。