2017-03-16 48 views
1

我正在使用Spring控制器中的外部REST api,并且必须在返回它之前聚合一些调用以填充我的模型。假设我的模式是这样的:在Spring中处理嵌套REST资源调用的更优雅方法?

public class MyModel{ 
    public String id; 
    public String field1; 
    public String field2; 
} 

的API,我消耗要约的一个调用来获取所有可用的对象GET /objects的识别码与一些requred字段列表。

[ 
    { 
     "id": "some_id_1", 
     "field1": "some_value_1" 
    }, 
    { 
     "id": "some_id_2", 
     "field1": "some_value_2" 
    } 
] 

现在,API提供给我第二个电话GET /object/{id}得到一个版本的对象的所有领域。

//GET /object/some_id_1 
{ 
    "id": "some_id_1", 
    "field1": "some_value_1", 
    "field2": "some_other_value_1" 
} 

在列表调用中无法获得这个扩展版本的对象。

我正在使用RestTemplate与杰克逊,我想知道是否有更好的方法来建立一个列表的扩展版本的列表比首先调用然后列表方法,然后在所有的Ids的foreach,调用详细资源并将结果附加到列表中。当然,我知道我无法减少剩余调用的实际数量,只是想知道是否有更优雅的方式在Spring中编写它(也许有注释等)。

List<MyModel> result = new List<>(); 
MyModel[] models = restTemplate.getForObject("/objects", MyModel[].class); 
for(MyModel slimModel: models){ 
    MyModel fatModel = restTemplate.getForObject("/object/{id}", MyModel.class, slimModel.id); 
    result.add(fatModel); 
} 
return result; 

回答

0

你可以尝试这样的事:

List<MyModel> result = Arrays.asList(restTemplate.getForObject("/objects", MyModel[].class)); 
+0

这是把一个数组一般列表的更好的方式,但它并不占嵌套{ID} REST调用。 – Tom

+0

如果您正在使用Java 8,则可以使用lambda通过其余调用映射对象。尝试如下:列表 result = Arrays.asList(restTemplate.getForObject(“/ objects”,MyModel []。class))。stream()。map(slimModel - > restTemplate.getForObject(“/ object/{id} “,MyModel.class,slimModel.id)); –