跳到主要内容

后端集成:GraphQL To Java类 — Numio

使用 @graphql-codegen/java 为 GraphQL schema 中的 enum 和 input 类型生成 Java 类。所有内容都嵌套在 public class Types 中;对象类型、interface 和查询不会被转换。

在 graphql-java 服务端为 mutation 参数创建 Java input 类。

GraphQL Schema

Java (Enum and Input)

适用场景

  • 在 graphql-java 服务端为 mutation 参数创建 Java input 类。
  • 得到与 GraphQL 枚举值完全一致的 Java enum。

使用方法

  1. 将包含 enum 和 input 定义的 schema 粘贴到 GraphQL Schema 编辑器。
  2. 查看生成的 Types 类:每个 GraphQL enum 对应一个 public enum,每个 input 类型对应一个 public static class。
  3. 复制到 Types.java 文件中,并将 package com.example.graphql 改为你自己的包名。

GraphQL schema

enum Role {
  ADMIN
  EDITOR
}

input CreateUserInput {
  name: String!
  email: String
  role: Role = EDITOR
  tags: [String!]
}

type Query {
  ping: String
}

Java enum 与 input 类

package com.example.graphql;

import java.util.HashMap;
import java.util.Map;

public class Types {
  public enum Role {
    ADMIN,
    EDITOR
    
  }
  
  public static class CreateUserInput {
    private String name;
    private String email;
    private Role role;
    private Iterable<String> tags;
  
    public CreateUserInput(Map<String, Object> args) {
      if (args != null) {
        this.name = (String) args.get("name");
        this.email = (String) args.get("email");
        if (args.get("role") instanceof Role) {
          this.role = (Role) args.get("role");
…

功能与限制

package 行默认为 com.example.graphql,因为页面没有包名设置。请改为项目自己的包名。

每个 input 类都有一个读取 Map<String, Object> 参数的构造函数,以及 getter 和 setter。schema 中的默认值(role: Role = EDITOR)不会被应用。

类型映射:String 对应 String,Int 对应 Integer,Float 对应 Double,Boolean 对应 Boolean,ID 对应 Object,列表对应 Iterable<T>。名称不以 Input 结尾的 input 会加上该后缀(A 变为 AInput)。

FAQ

为什么 Java 输出中没有我的对象类型?

java 插件只生成 enum 和 input 类型。如需为每个对象类型生成 data fetcher 接口,请在 GraphQL to Resolvers Signature 页面使用 JAVA Resolvers Signature 选项。

嵌套的 input 类型如何处理?

类型为另一个 input 的字段会变为对应的类,构造函数从嵌套的 map 构建它,例如 new BInput((Map<String, Object>) args.get("nested"))。

会在服务器上运行吗?

不会。代码生成器在浏览器的 Web Worker 中运行。

规范与参考资料