后端集成:GraphQL To Java类 — Numio
使用 @graphql-codegen/java 为 GraphQL schema 中的 enum 和 input 类型生成 Java 类。所有内容都嵌套在 public class Types 中;对象类型、interface 和查询不会被转换。
在 graphql-java 服务端为 mutation 参数创建 Java input 类。
适用场景
- 在 graphql-java 服务端为 mutation 参数创建 Java input 类。
- 得到与 GraphQL 枚举值完全一致的 Java enum。
使用方法
- 将包含 enum 和 input 定义的 schema 粘贴到 GraphQL Schema 编辑器。
- 查看生成的 Types 类:每个 GraphQL enum 对应一个 public enum,每个 input 类型对应一个 public static class。
- 复制到 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 中运行。