2016-10-31 16 views
2

Мы пытаемся разобрать ниже JSON, чтобы получить список людей.Разбор _измеримых элементов из ответа JSON HAL

JSON ответ:

{ 
    "_embedded": { 
    "people": [ 
     { 
     "id": 35356, 
     "name": "Jon", 
     "description": "Test", 
     "type": "person", 
     "_links": { 
      "self": { 
      "href": "http://localhost/api/v1/50452/people/35356" 
      }, 
      "items": { 
      "href": "http://localhost/api/v1/50452/items?person_id=35356" 
      }, 
      "enabled_services": [ 
      { 
       "title": "Water Company", 
       "href": "http://localhost/api/v1/50452/services/103890" 
      } 
      ] 
     } 
     }, 
     { 
     "id": 46363, 
     "name": "Kevin", 
     "description": "", 
     "type": "person", 
     "_links": { 
      "self": { 
      "href": "http://localhost/api/v1/50452/people/46363" 
      }, 
      "items": { 
      "href": "http://localhost/api/v1/50452/items?person_id=46363" 
      }, 
      "enabled_services": [ 
      { 
       "title": "Water Company", 
       "href": "http://localhost/api/v1/50452/services/103890" 
      } 
      ] 
     } 
     } 
    ] 
    }, 
    "_links": { 
    "self": { 
     "href": "http://localhost/api/v1/50452/people" 
    } 
    } 
} 

Наш код:

ParameterizedTypeReference<Resources<Person>> resource = new ParameterizedTypeReference<Resources<Person>>() {}; 

Traverson traverson = new Traverson(new URI("http://localhost/api/v1/people"), MediaType.APPLICATION_JSON_UTF8); 

// Create our own LinkDiscoverer as our service returns application/json instead of application/json+hal 
List<LinkDiscoverer> linkDiscoverers = new ArrayList<>(); 
linkDiscoverers.add(new JsonPathLinkDiscoverer("$._links..['%s']..href", MediaType.APPLICATION_JSON_UTF8)); 
traverson.setLinkDiscoverers(linkDiscoverers); 

HttpHeaders headers = new HttpHeaders(); 
headers.add("App-Key", Globals.Appkey); 
headers.add("App-Id", Globals.AppId); 

Resources<Person> personResources = traverson.follow("people").withHeaders(headers).toObject(resource); 

Однако мы получаем следующее сообщение об ошибке:

java.lang.IllegalStateException: Expected to find link with rel 'people' in response {"_embedded":{"people":[{"id":31350,"name":"Jon Blue","description":"Developer","type":"person","deleted":false,"disabled":false,"company_id":50452,"order":31350,"phone_prefix":"44","_links":{"self":{"href":"http://localhost/api/v1/50452/people/31350"},"items":{"href":"http://localhost/api/v1/50452/items?person_id=31350"},"enabled_services":[{"title":"Water ... 

основе (очень ограниченных) клиента документы это кажется быть правильным способом делать что-то. Кто-нибудь знает, что мы можем здесь пропустить?

Благодаря

ответ

0

The Traverson предназначен для использования по ссылкам:

Component to ease traversing hypermedia APIs by following links with relation types. Highly inspired by the equally named JavaScript library.

Там нет никакой связи с отном people в ответ, поэтому он не может следовать.

я мог себе представить, что вы хотели назвать ресурс верхнего уровня, который имеет связь с people:

Traverson traverson = new Traverson(new URI("http://localhost/api/v1/"), MediaType.APPLICATION_JSON_UTF8); 

В противном случае я хотел бы предложить, чтобы использовать RestTemplate, чтобы получить ресурс:

restTemplate.exchange(
       URI.create("http://localhost/api/v1/people"), 
       HttpMethod.GET, 
       new HttpEntity<Void>(headers), 
       resource).getBody(); 
Смежные вопросы