2017-03-16 53 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)); –