graphql java:全局dataFetcher和动态对象

时间:2017-08-24 02:34:00

标签: java graphql graphql-java

我试图像使用REST API的客户端一样使用GraphQL。我的后端返回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和创建全局执行解析器的方法吗?

1 个答案:

答案 0 :(得分:0)

如果你正在使用像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或其他任何操作。