2015-01-02 18 views
6

2つのアプリケーションがあります.1つはbarと呼ばれ、どのようなリソースがHAL形式で提供されますか。もう1つは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" 
      } 
     } 
    }, 
    { 
     ... 

今、私は春RestTemplateを使用してBCMからそれを消費してみてください。私のソリューションはうまくいきますが、私はその解決策には何とか満足していません。もっとクリーンな方法があると思います。

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; 
} 

あなたが見るように、いくつかの醜いコードがあります。そのうちの1つは、自分のコレクションには何のジェネリックもないということです。もう一つのポイントは、私はResource_IDを非常に複雑にしています。私はStringUtils.removeを何度か使って自己のURLを抽出します。

Springの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のジェネリックサポートを導入しようと考えていますが、詳細は認識していません。 URLからIDを抽出アドレッシング

を私はクライアント側で異なるモデルを使用して文字列でidフィールドの種類を交換し、その中にURL全体を保存することをお勧めします。こうすることで、好きなときにいつでもエンティティ全体を簡単に再取得することができ、URLを自分で構築する必要はありません。あなたはあなたのAPIにPOSTリクエストを提出する予定がある場合は、後で必要となります。なぜなら、spring-hateaosはIDの代わりにリンクを送信する必要があるからです。 一般的なPOSTリクエストは次のようになります。

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

この回答の最新のアップデートはありますか? – Snekse

+0

残念ながら。しかし、私はまだそれ以来多くの研究をしていません。 –

+2

'ParameterizedTypeReference >(){}'を使うと、サブクラス化を避けることができます。 – afaulconbridge

関連する問題