如何正确使用 Java 中 Apollo Client 的 RxJava2 库进行同步调用?

Posted

技术标签:

【中文标题】如何正确使用 Java 中 Apollo Client 的 RxJava2 库进行同步调用?【英文标题】:How can I use the RxJava2 library for the Apollo Client in Java properly for synchronous calls? 【发布时间】:2020-09-05 05:10:25 【问题描述】:

RxJava2 可用于Apollo GraphQL JVM。但我可以弄清楚如何正确使用它。我尝试同步使用它:

/**
 * This method is supposed to send an Apollo Call, map the data of the Responses into Optionals and 
 * give back the Optional<Data> object.
 * @param <T>: the build query
 * @param <V>: the expected data structure
 *
*/
    public static <T extends com.apollographql.apollo.api.Query> Optional<Data> execute(
            T operation) 
        ApolloClient client = new CommonClient().getClient();
        ApolloCall<Data> apolloCall = client.query(operation);
        return Rx2Apollo.from(apolloCall)
                .map(value -> Optional.of(value.data()))
                .onErrorReturn(o ->  
                  logger.error(o.getMessage());
                  return Optional.empty();
                )
                .blockingFirst();
    

但问题是我在 .map(value -> Optional.of(value.data())) 行上遇到错误。错误是:

java.util.Optional 不能转换为 com.example.graphql.client.KundeQuery$Data

那么,我做错了什么?或者至少有一种更简单的方法来同步处理 Apollo GraphQL JVM Client 中的数据?

【问题讨论】:

【参考方案1】:

我已经知道了。传入的数据结构是 Response> 而不是 >。所以它无法读取它。解决方案可能是这样的:

public static <T extends com.apollographql.apollo.api.Query> Optional<Data> execute(T operation) 

    ApolloClient client = new CommonClient().getClient();
    ApolloCall<Optional<Data>> apolloCall = client.query(operation);

    return Rx2Apollo.from(apolloCall)
            .map(IncomingResponse::extracted)
            .onErrorReturn(o -> 
                logger.error(o.getMessage());
                return Optional.empty();
                )
            .blockingFirst();


private static Optional<Data> extracted(Response<Optional<Data>> value) 
    Optional<Data> result = value.data();
    return result; //Optional.of(localData);

【讨论】:

以上是关于如何正确使用 Java 中 Apollo Client 的 RxJava2 库进行同步调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apollo 在 Nuxt 生成的动态页面中正确填充页眉?

如何在 react-apollo graphql 查询中正确使用动态变量?

使用 Apollo 和 React 捕获身份验证失败后如何正确重定向

如何在 Apollo Server 中正确键入上下文对象?

Vue Apollo - 如何正确获取数据?

如何正确地将变量传递给 apollo useQuery?