【问题标题】:graphql java: global dataFetcher and dynamic objectgraphql java:全局dataFetcher和动态对象
【发布时间】:2018-02-01 18:31:03
【问题描述】:

我正在尝试使用 GraphQL 之类的 REST API 客户端。我的后端返回 JSON,但在我的应用程序客户端中我编写了 graphQL,在客户端中我将 graphQL 查询转换为 HTTP 调用。

我的架构:

type Query {
   students: [Student]
}
type Student {
   name: String
}

POJO 示例:

public class Student {
    private Integer id;
    private String name;
}

我的解析器:

public class Query implements GraphQLQueryResolver {
  public List<Post> students() {
    // HTTP Request
   }
}

在所有库的实现中,我需要为 Student 创建一个 POJO,并在我的 API 中为请求编写一个解析器。

存在不需要创建 POJO 和创建全局执行解析器的方法吗?

【问题讨论】:

    标签: java graphql graphql-java


    【解决方案1】:

    如果您使用的是 graphql-java-tools 之类的库(似乎是这种情况),您需要 POJO,因为这是库从中获取其类型映射的地方。但是如果你只是使用 graphql-java 本身,你可以用任何你喜欢的方式连接它——包括有一个全局解析器(即DataFetcher)。

    有关如何执行此操作的想法,请参阅http://graphql-java.readthedocs.io/en/latest/schema.html#idl

    你想要这样的东西:

    SchemaParser schemaParser = new SchemaParser();
    SchemaGenerator schemaGenerator = new SchemaGenerator();
    
    File schemaFile = loadSchema("yourStudentSchema.graphqls");
    
    TypeDefinitionRegistry typeRegistry = schemaParser.parse(schemaFile);
    RuntimeWiring wiring = buildRuntimeWiring();
    GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeRegistry, wiring);
    

    RuntimeWiring 是你挂钩解析器的地方,例如:

    RuntimeWiring buildRuntimeWiring() {
        return RuntimeWiring.newRuntimeWiring()
                // this uses builder function lambda syntax
                .type("Query", typeWiring -> typeWiring
                        .dataFetcher("students", env -> fetchDataSomeHow(env)))             
                .build();
    }
    

    因此,您可以为每个 dataFetcher 调用提供相同的 DataFetcher 实现,这就是您所追求的。 graphql-java 本身对它的连接和实现方式没有任何假设,例如它不强制执行 POJO 或其他任何事情。

    【讨论】:

    • 感谢回复...我的解决方案与您的建议略有不同,但在简历中是相等的...对于不要写 pojo,我的解决方案是创建单个 graphql 类型(例如```restCall () { 数据 } ```)
    • @Renan 你不是这样牺牲了 GraphQL 的大部分好处吗?
    • 一点点,但是这种方式非常适合这项服务......对于你有上下文,我在这个解决方案之后将此服务投入生产......我知道我在实体中丢失了类型安全(例如@ 987654327@),但仍然有一个类型安全的字段...该服务是一个 api 的客户端,用于由用户生成/创建自定义报告并呈现(例如,用户在选择用户和请求后创建带有标记实体的报告报告然后在 graphql 中创建查询以打印此报告)
    • 我不知道你是否知道 Scala...但是我在 Scala 中搜索这种方式似乎更安全...您可以在编译时创建/也许使用宏创建模式和“pojo's “……但我不确定
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2017-05-17
    • 2019-06-18
    • 1970-01-01
    • 2015-07-12
    • 2012-04-23
    相关资源
    最近更新 更多