我正在使用Apollo的查询自动生成功能在Java应用程序中实现GraphQL客户端,到目前为止,我已经能够链接调用,并且还获得了所需的数据。问题是,Apollo使我实现了覆盖ApolloCall.Callback<>()
和void onResponse(Response response)
的匿名方法void onFailure()
,但是我无法找到一种方法来持有此Response
对象,我想收集该对象并确保我有。
这是Java 11上的Spring Boot项目,我尝试使用CompletableFuture
,但对它的知识以及如何将其用于解决这个特殊问题的了解有限,我感到很不走运。我还尝试实现了Apollo应该具有的RxJava支持,但是我无法使用该方法解决依赖关系问题。
我很确定期货会解决这个问题,但我又不知道如何。
public void getOwnerIdFromClient() {
client
.query(getOwnerDbIdQuery)
.enqueue(
new ApolloCall.Callback<>() {
@Override
public void onResponse(@Nonnull Response<Optional<GetOwnerDbIdQuery.Data>> response) {
int ownerId =
response
.data()
.get()
.entities()
.get()
.edges()
.get()
.get(0)
.node()
.get()
.ownerDbId()
.get();
System.out.println("OwnerId = " + ownerId);
}
@Override
public void onFailure(@Nonnull ApolloException e) {
logger.error("Could not retrieve response from GetOwnerDbIdQuery.", e);
}
});
}
由于我希望在int ownerId
之外使用此onResponse
,因此这不是一个足够的解决方案。我实际上想进行x次调用,并创建我实际获得的所有ID的列表,因为这也可能返回一个空ID,这意味着我需要某种方式来等待它们完成。
您是对的,可以使用期货来完成:
大约:
public Future<Integer> getOwnerIdFromClient(){
Future<Integer> result=new CompletableFuture<Integer>();
client
.query(getOwnerDbIdQuery)
.enqueue(
new ApolloCall.Callback<>(){
@Override
public void onResponse(@Nonnull Response<Optional<GetOwnerDbIdQuery.Data>>response){
// get owner Id
System.out.println("OwnerId = "+ownerId);
result.complete(ownerId)
}
@Override
public void onFailure(@Nonnull ApolloException e){
logger.error("Could not retrieve response from GetOwnerDbIdQuery.",e);result.completeExceptionally(e);
}
});
return result;
}