本文へスキップ

GraphQLからJavaクラスへの変換器 — Numio

@graphql-codegen/java を使って、GraphQL スキーマの enum と input 型から Java クラスを生成します。すべて public class Types の中にネストされ、オブジェクト型、interface、クエリは変換されません。

graphql-java のサーバーで mutation の引数用に Java の input クラスを作る。

GraphQL Schema

Java (Enum and Input)

こんなときに使えます

  • graphql-java のサーバーで mutation の引数用に Java の input クラスを作る。
  • GraphQL の enum 値とまったく同じ Java の enum を得る。

使い方

  1. enum と input の定義を含むスキーマを GraphQL Schema エディターに貼り付けます。
  2. 生成された Types クラスを確認します。GraphQL の enum ごとに public enum が 1 つ、input 型ごとに public static class が 1 つ生成されます。
  3. Types.java ファイルにコピーし、package com.example.graphql を自分のパッケージに変更します。

GraphQL スキーマ

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 があります。スキーマのデフォルト値(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 で実行されます。

仕様を確認する