2015-01-02 22 views
6

İki uygulama var, bunlardan biri bar, HAL biçiminde bana kaynaklar sağlıyor. Diğer, bu servisi tüketmek için bcm'dur. yanıtı bara aitTüketim Spring Hateoas Restservice with RestTemplate

Örnek şuna benzer:

[ 
    { 
     "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" 
      } 
     } 
    }, 
    { 
     ... 

Şimdi Bahar RestTemplate kullanarak bcm o tüketmeye çalışın. Benim Çözümüm çalışıyor, ama bu çözümden bir şekilde memnun değilim ve sanırım daha temiz bir yol var. Gördüğünüz gibi

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

birkaç çirkin kod vardır: gibi

RestService tüketen Müşteri-Kod görünüyor. Bunlardan biri, koleksiyonlarım için herhangi bir jenerik yok. Diğer nokta, ben Resource_ID çok karmaşık ve ben self url ayıklamak için birçok kez StringUtils.remove kullanın.

Bahardan HAL-Cevabı tüketmenin daha uygun bir yolu olması gerektiğinden eminim.

Teşekkürler.

cevap

3

Spring-hateaos'tan Resource sınıfına bir göz atın.

Bağlantılardan bağlantıyı ayıklamak için yöntemler sağlar. Ancak RestTemplate, sınıfı değişken olarak sağlamanızı gerektirdiğinden, istenen varlığın alt sınıfını oluşturmanın ve RestTemplate için kullanmanın farklı bir yolunu bulamadım.

Kodun sonra bu gibi görünebilir: Eğer tam bir listesini talep etmek istiyorsanız

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 

, sen RestTemplate için varlığın dizisi sürümünü geçmesi gerekir: Maalesef

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

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

Yine, her bir varlık için bir alt sınıf oluşturmamız gerektiğinden, genel sınıfın tüm amacını yenen Resource<Beruf>.class yazamayız. Bunun arkasındaki nedene tip silme denir. RestTemplate için genel destek sunmayı planladıklarını bir yere okudum ama herhangi bir detayın farkında değilim. Ben istemci tarafında farklı bir model kullanmak ve dize ile kimliği alanı türünü değiştirmek ve içine bütün url saklamak için öneriyoruz

: url id çıkarma adresleme

. Bu şekilde, istediğiniz zaman tüm varlığı kolayca yeniden girebilir ve URL’yi kendiniz oluşturmanız gerekmez. API'ınıza POST-istekleri göndermeyi planlıyorsanız, daha sonra URL'ye ihtiyacınız olacaktır; çünkü ilkbahar-hatealar, kimlik yerine bağlantıyı göndermenizi gerektirir. Tipik SONRASI isteği bu gibi görünebilir:

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

tüm güncel bilgiler bu yanıt için son sürümleri ile? – Snekse

+0

Ne yazık ki değil. Ama o zamandan beri pek fazla araştırma yapmadım. –

+2

Alt sınıflamadan kaçınmak için 'new ParameterizedTypeReference >() {}' kullanabilirsiniz. – afaulconbridge