Pular para o conteúdo

Converter GraphQL em classes Java — Numio

Gera classes Java para os enums e tipos input de um schema GraphQL usando @graphql-codegen/java. Tudo fica aninhado dentro de public class Types; tipos de objeto, interfaces e queries não são convertidos.

Criar classes input Java para os argumentos de mutations em um servidor graphql-java.

GraphQL Schema

Java (Enum and Input)

Quando usar

  • Criar classes input Java para os argumentos de mutations em um servidor graphql-java.
  • Obter enums Java que espelham exatamente os valores dos enums GraphQL.

Como usar

  1. Cole no editor GraphQL Schema um schema com definições enum e input.
  2. Revise a classe Types gerada: um public enum por enum GraphQL e uma public static class por tipo input.
  3. Copie-a para um arquivo Types.java e troque package com.example.graphql pelo seu próprio pacote.

Schema GraphQL

enum Role {
  ADMIN
  EDITOR
}

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

type Query {
  ping: String
}

Enums e classes input Java

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");
…

Detalhes e limitações

A linha package usa com.example.graphql por padrão, porque a página não tem configuração de pacote. Troque pelo pacote do seu projeto.

Cada classe input tem um construtor que lê um Map<String, Object> de argumentos, além de getters e setters. Valores padrão do schema (role: Role = EDITOR) não são aplicados.

Mapeamento de tipos: String para String, Int para Integer, Float para Double, Boolean para Boolean, ID para Object e listas para Iterable<T>. Nomes de input que não terminam em Input recebem o sufixo (A vira AInput).

FAQ

Por que meus tipos de objeto não aparecem na saída Java?

O plugin java gera apenas enums e tipos input. Para interfaces de data fetcher por tipo de objeto, use a opção JAVA Resolvers Signature na página GraphQL to Resolvers Signature.

Como os tipos input aninhados são tratados?

Um campo cujo tipo é outro input vira essa classe, e o construtor a monta a partir do map aninhado, por exemplo new BInput((Map<String, Object>) args.get("nested")).

Isso roda em um servidor?

Não. O gerador de código roda em um Web Worker no seu navegador.

Especificações e referências