GraphQL 和 Java

GraphQL and Java

我是 GraphQL 的新手。我正在尝试使用 graphql-java 在 Java 中为一个非常简单的模式实现服务器端代码。但是,我得到 "WARNING: Query failed to validate : '{articles}'" 和 NullPointerException (这是有道理的)。如何从我的简单查询中获取结果?我究竟做错了什么?有趣的是,当我将 Query 中的 articles 类型更改为 String 时(如下所示),它起作用了!

type Query {
    articles: String
}

这是我的实际架构:

schema {
    query: Query
}

type Query {
    articles: [Article]
}

type Article {
    id: Int!
    title: String
    text: String
}

这是我的 Java bean(我使用了 Lombok 注释):

package org.code.beans;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Article {

    private int id;
    private String title;
    private String text;

}

存储库class:

package org.code.repositories;

import java.util.ArrayList;
import java.util.List;

import org.code.beans.Article;

public class ArticleRepository {

    private List<Article> articles;


    public ArticleRepository() {
        this.articles = new ArrayList<>();
    }


    public void addArticle(Article article) {
        articles.add(article);
    }


    public List<Article> findAll() {
        return articles;
    }


    public Article findOne(int id) {
        return articles.stream()
                .filter(article -> article.getId() == id)
                .findFirst()
                .orElse(null);
    }

}

包含 GraphQL 代码的可执行测试 class:

package org.code.tests;

import java.io.File;
import java.util.List;

import org.code.beans.Article;
import org.code.repositories.ArticleRepository;

import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import graphql.schema.GraphQLSchema;
import graphql.schema.idl.RuntimeWiring;
import graphql.schema.idl.SchemaGenerator;
import graphql.schema.idl.SchemaParser;
import graphql.schema.idl.TypeDefinitionRegistry;

public class Test {

    public static void main(String[] args) {
        ArticleRepository articleRepository = new ArticleRepository();
        Article article1 = new Article(1, "Article 1", "Text 1");
        Article article2 = new Article(2, "Article 2", "Text 2");
        articleRepository.addArticle(article1);
        articleRepository.addArticle(article2);


        SchemaParser parser = new SchemaParser();
        TypeDefinitionRegistry registry = parser.parse(new File("./src/org/code/resources/schema.graphql"));

        DataFetcher<List<Article>> articlesDataFetcher = new DataFetcher<List<Article>>() {
            @Override
            public List<Article> get(DataFetchingEnvironment env) throws Exception {
                return articleRepository.findAll();
            }};

        RuntimeWiring runtimeWiring = RuntimeWiring.newRuntimeWiring()
                .type("Query", wiring -> wiring.dataFetcher("articles", articlesDataFetcher))
                .build();

        SchemaGenerator generator = new SchemaGenerator();
        GraphQLSchema schema = generator.makeExecutableSchema(registry, runtimeWiring);

        GraphQL graphQl = GraphQL.newGraphQL(schema).build();
        ExecutionResult result = graphQl.execute("{articles}");

        System.out.println(result.getData().toString());
    }

}

您不能在对象类型上有 "ends" 的查询。当您的查询 selects articles 这是一个对象列表时,但您必须 select 这些对象中的至少一个字段。你可以试试

graphQl.execute("{ articles { id title text } }")

您可以尝试以下方法:

type Query {

  articles(id: Int!, title: String, text: String): [Article]
}