2015-01-02 40 views
6

我有兩個應用程序,一個叫做bar,什麼爲我提供了HAL格式的資源。另一個是bcm消耗該服務。與RestTemplate一起使用Spring Hateoas Restservice

響應酒吧的例子是這樣的:

[ 
    { 
     "name":"Brenner/in", 
     "_links":{ 
      "self":{ 
       "href":"..host/bbsng-app-rest/betrieb/15" 
      } 
     } 
    }, 
    { 
     "name":"Dienstleistungshelfer/in HW", 
     "_links":{ 
      "self":{ 
       "href":"..host/bbsng-app-rest/betrieb/4" 
      } 
     } 
    }, 
    { 
     ... 

現在,我嘗試使用,從使用Spring RestTemplate 億立方米。我的解決方案有效,但我不知道該解決方案,我想有一個更乾淨的方式。

我的客戶碼耗時RestService樣子:

@Autowired private RestTemplate template; 

@Override 
@SuppressWarnings("unchecked") 
public BerufListe findeAlleBerufe() { 
    final BerufListe berufListe = new BerufListe(); 

    final ResponseEntity<List> entity = template.getForEntity(LinkUtils.findBeruf(), List.class); 

    if (OK.equals(entity.getStatusCode())) { 
     final List<LinkedHashMap> body = entity.getBody(); 
     for (final LinkedHashMap map : body) { 
      final LinkedHashMap idMap = (LinkedHashMap) map.get("_links"); 
      String id = remove(String.valueOf(idMap.get("self")), "href="); 
      id = remove(id, "{"); 
      id = remove(id, "}"); 
      final String name = String.valueOf(map.get("name")); 
      final Beruf beruf = new Beruf(id, name); 
      berufListe.add(beruf); 
     } 
    } 

    return berufListe; 
} 

當你看到有一些醜陋的代碼。其中之一是,我沒有任何仿製藥。另一點,我得到Resource_ID非常複雜,並且我多次使用StringUtils.remove來提取自我url。

我確定春天必須有一種更方便的方式來使用HAL-Response。

謝謝你。

回答

3

看看spring-hateaos的Resource課程。

它提供了從響應中提取鏈接的方法。 但是,由於RestTemplate要求您提供該類作爲變量,除了創建所需實體的子類並將其用於RestTemplate之外,我還沒有找到其他方法。然後

你的代碼看起來是這樣的:

public class BerufResource extends Resource<Beruf> { } 

BerufResource resource = template.getForEntity("http://example.at/berufe/1", BerufResource.class); 
Beruf beruf = resource.getContent(); 
// do something with the entity 

如果你想申請的完整列表,你需要你的實體的陣列版本傳遞給RestTemplate:

BerufResource[] resources = template.getForEntity("http://example.at/berufe", BerufResource[].class); 

List<BerufResource> berufResources = Arrays.asList(resources); 
for(BerufResource resource : berufResources) { 
    Beruf beruf = resource.getContent(); 
} 

不幸,我們不能寫出Resource<Beruf>.class,它違背了泛型類的全部目的,因爲我們需要爲每個實體再次創建一個子類。背後的原因被稱爲類型刪除。我在某處讀過他們計劃推出對RestTemplate的通用支持,但我不知道任何細節。

解決的ID從URL中提取:

我會建議使用在客戶端不同的模式,代之以字符串id字段的類型和整個URL存儲在裏面。這樣,您可以隨時輕鬆地重新獲取整個實體,而無需自己構建URL。無論如何,如果您計劃向您的API提交POST請求,您將需要URL,因爲spring-hateaos要求您發送鏈接而不是id。 一個典型的POST請求可能看起來像這樣:

{ 
    "firstname": "Thomas", 
    "nachname": "Maier", 
    "profession": "http://example.at/professions/1" 
} 
+0

有任何更新,最近發佈了這個答案? – Snekse

+0

不幸的不是。但從那時起我還沒有做過多的研究。 –

+2

您可以使用'new ParameterizedTypeReference >(){}'來避免子類化。 – afaulconbridge

相關問題