java - 如何获取异步回调“onResponse”的参数?
问题描述
我正在使用 Apollo 的自动生成查询在 Java 应用程序中实现 GraphQL 客户端,到目前为止,我已经能够链接调用并且还获得了我想要的数据。问题是 Apollo 让我实现了ApolloCall.Callback<>()
覆盖void onResponse(Response response)
and的匿名方法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 的列表,因为这也可能返回一个 null id,这意味着我需要一些方法来等待它们全部完成。
解决方案
如果其他人遇到这个问题,我花了很长时间才弄清楚泛型,但是您可以通过使用以下函数以通用方式执行此操作(以避免复制/粘贴所有不同的查询类型)作为单独的类或包装器:
private <D extends Operation.Data, T, V extends Operation.Variables> CompletableFuture<T> execute(Query<D, T, V> query) {
CompletableFuture<T> future = new CompletableFuture<>();
client.query(query).enqueue(new ApolloCall.Callback<>() {
@Override
public void onResponse(@NotNull Response<T> response) {
if (response.hasErrors()) {
String errors = Objects.requireNonNull(response.getErrors()).stream().map(Object::toString).collect(Collectors.joining(", "));
future.completeExceptionally(new ApolloException(errors));
return;
}
future.complete(response.getData());
}
@Override
public void onFailure(@NotNull ApolloException e) {
future.completeExceptionally(e);
}
});
return future;
}
那么它应该只是一个调用的情况
Integer myResult = execute(getOwnerDbIdQuery).get();
推荐阅读
- c# - 将 RemotingProxy 的 __TransparentProxy 包装在另一个 Proxy 中会抛出 RemotingException
- string - MongoDB $substr 从索引到索引
- django - Django:在模型创建时创建一对一实例
- reactjs - 使用 ScrollView 滚动到不同的位置
- python - PyCharm 错误:进程以退出代码 132 完成(被信号 4:SIGILL 中断)
- sql - 如何使用 PostgreSQL 执行 MERGE(插入/更新/删除)?
- symfony - Symfony 4 - FOSUserBundle - 保护身份验证器
- spring - Spring statemachine JPA config-我们可以在 Action 表中使用 SpEL 表达式调用非静态方法吗?
- php - 如何在数据表中显示数据透视表中的数据?
- r - 如何在 R 中组合数据框