GraphQL Java — 用于在 Java 中实现 GraphQL API 的服务器端库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐