The json is of this structure:
{
"data": [{"id":"1", "name":"foo"}]
}
I have a DTO of the form
class Domain {
String id;
String domain;
}
I want to parse the array into List and ignore data. This is the code:
@WithUserDetails("testuser")
@Test
public void test_get_domains_api() {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.add("User-Agent", "Spring's RestTemplate" );
headers.add("Authorization", "Bearer " TOKEN );
ResponseEntity<Map<String, List<Domain>>> response = restTemplate.exchange(
"https://sample/v1/sites",
HttpMethod.GET,
new HttpEntity<>("parameters", headers),
Map<String, List<Domain>>.class
);
System.out.println(response.getBody());
assertNotNull(response);
}
But I get this exception
Error while extracting response for type [class [Lcom.commengine.entity.Domain;]
and content type [application/json];
nested exception is org.springframework.http.converter.HttpMessageNotReadableException:
JSON parse error:
Cannot deserialize instance of [Lcom.commengine.entity.Domain; out of START_OBJECT
token; nested exception is
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize
instance of [Lcom.commengine.entity.Domain; out of START_OBJECT token
at [Source: (PushbackInputStream); line: 1, column: 1]
CodePudding user response:
I would suggest you changing your model as follows:
class ResponseDomainData {
List<Domain> data;
}
class Domain {
String id;
String name;
}
And your test also:
@WithUserDetails("testuser")
@Test
public void test_get_domains_api() {
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.add("User-Agent", "Spring's RestTemplate" );
headers.add("Authorization", "Bearer " TOKEN );
ResponseEntity<ResponseDomainData> response = restTemplate.exchange(
"https://sample/v1/sites",
HttpMethod.GET,
new HttpEntity<>("parameters", headers),
ResponseDomainData.class
);
System.out.println(response.getBody());
assertNotNull(response);
}