GraphQL Java — 用于在 Java 中实现 GraphQL API 的服务器端库
GraphQL Java 是一个强大且灵活的服务器端库,用于在 Java 语言中实现 GraphQL 规范。它允许开发人员创建高效、类型安全且易于扩展的 API,使客户端能够仅请求所需的数据。该库得到社区的积极维护,并被许多大型公司用于生产环境。
主要功能
- 完全支持 GraphQL 规范 — 实现所有类型、指令、变更、订阅和片段。
- 灵活的类型系统 — 支持基于 Java 类(code-first)和通过 SDL(schema-first)定义模式。
- 内置异步支持 — 使用
CompletableFuture高效处理请求。 - DataLoader — 内置工具,用于解决 N+1 查询问题和批量数据加载。
- 测试工具 — 用于对模式和解析器进行单元测试的内置类。
- 可扩展性 — 支持自定义标量、指令和验证工具。
库架构
该库由几个关键组件组成:
- GraphQLSchema — 表示 API 模式的对象。
- DataFetcher — 用于获取数据的函数式接口(类似于 GraphQL 中的解析器)。
- TypeResolver — 用于解析多态类型(接口和联合类型)的接口。
- ExecutionStrategy — 查询执行策略(默认为异步)。
- Instrumentation — 用于注入额外逻辑(日志记录、指标)的机制。
使用示例
让我们看一个创建用于管理书籍的 GraphQL 服务器的简单示例。
1. 通过 SDL 定义模式
// schema.graphqlstype Query { books: [Book] bookById(id: ID!): Book}
type Book { id: ID! title: String! author: String! year: Int}2. 创建解析器
import graphql.schema.DataFetcher;import graphql.schema.DataFetchingEnvironment;
public class BookDataFetcher {
public static DataFetcher<List<Book>> getBooksDataFetcher() { return environment -> { // 在实际应用中,这里会查询数据库 return List.of( new Book("1", "1984", "George Orwell", 1949), new Book("2", "Brave New World", "Aldous Huxley", 1932) ); }; }
public static DataFetcher<Book> getBookByIdDataFetcher() { return environment -> { String id = environment.getArgument("id"); // 根据 ID 查找书籍 return findBookById(id); }; }}3. 组装模式并执行查询
import graphql.GraphQL;import graphql.schema.GraphQLSchema;import graphql.schema.idl.RuntimeWiring;import graphql.schema.idl.SchemaParser;import graphql.schema.idl.SchemaGenerator;import graphql.schema.idl.TypeDefinitionRegistry;
public class GraphQLExample { public static void main(String[] args) { // 加载 SDL String schema = "type Query { books: [Book] } type Book { id: ID! title: String! }"; SchemaParser schemaParser = new SchemaParser(); TypeDefinitionRegistry typeRegistry = schemaParser.parse(schema);
// 配置运行时绑定 RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring() .type("Query", builder -> builder .dataFetcher("books", BookDataFetcher.getBooksDataFetche