我很难通过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;以所需的格式?
答案 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的解决方案有效,我很乐意听到。