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

Is it possible to extract a set of database rows with RestTemplate?

我在使用 RestTemplate 从我的数据库中获取多个数据集时遇到困难。我有很多提取单行的例程,格式如下:

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

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

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

这 return 个值在

Map<String, LinkedHashMap<>> 

格式。有没有一种简单的方法可以 return 一个 List<> 或 Set<> 为所需的格式?

我假设您实际上不是指数据库,而是指 restful 服务,因为您正在使用 RestTemplate

你遇到的问题是你想取回一个Collection,但是getForObject方法只能接受一个类型参数,无法判断返回的集合是什么类型。

我建议您考虑使用 RestTemplate.exchange(...) 这应该允许您请求并接收一个集合类型。

我有一个有效的解决方案,至少现在是这样。我更喜欢 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 的解决方案起作用有任何想法,我很乐意听听。

从根本上说,问题是您的 Java 对象模型与 json 文档的结构不匹配。您正在尝试将单个 json 元素反序列化为 java 列表。您的 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
  }
]

然后您应该能够将其反序列化为 List< S_ServiceCoreTypeModel>。或者,如果您不能更改 json 结构,您可以创建一个 Java 对象模型,通过创建一些包装器 类 来模拟 json 文档。类似于:

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