是否可以使用 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;
...
}
我在使用 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;
...
}