У меня есть две конечные точки: /parent
и /child/{parentId}
Мне нужно вернуть список всех Child
public class Parent {
private long id;
private Child child;
}
public class Child {
private long childId;
private String someAttribute;
}
Однако вызов /child/{parentId}
довольно медленный, поэтому япытаясь сделать это:
- Позвоните
/parent
, чтобы получить 100 родительских данных, используя асинхронный RestTemplate - Для всех родительских данных, вызовите
/child/{parentId}
, чтобы получить подробную информацию - Добавьте результат вызова к
/child/{parentId}
в resultList
- Когда 100 вызовов к
/child/{parentId}
завершены, верните resultList
Я использую класс-оболочку, так как большинство конечных точек возвращаетJSON в формате:
{
"next": "String",
"data": [
// parent goes here
]
}
Так что я обертываю это в
public class ResponseWrapper<T> {
private List<T> data;
private String next;
}
Я написал этот код, но resultList всегда возвращает пустые элементы.Как правильно достичь этого?
public List<Child> getAllParents() {
var endpointParent = StringUtils.join(HOST, "/parent");
var resultList = new ArrayList<Child>();
var responseParent = restTemplate.exchange(endpointParent, HttpMethod.GET, httpEntity,
new ParameterizedTypeReference<ResponseWrapper<Parent>>() {
});
responseParent.getBody().getData().stream().forEach(parent -> {
var endpointChild = StringUtils.join(HOST, "/child/", parent.getId());
// async call due to slow endpoint child
webClient.get().uri(endpointChild).retrieve()
.bodyToMono(new ParameterizedTypeReference<ResponseWrapper<Child>>() {
}).map(wrapper -> wrapper.getData()).subscribe(children -> {
children.stream().forEach(child -> resultList.add(child));
});
});
return resultList;
}