繁体   English   中英

GraphQL和Java

[英]GraphQL and Java

我是GraphQL的新手。 我正在尝试使用graphql-java在Java中为非常简单的架构实现服务器端代码。 但是,我收到“警告:查询未能通过验证:'{articles}'”和一个NullPointerException (这很有意义)。 如何从简单查询中获得结果? 我究竟做错了什么? 有趣的是,当我将Queryarticles类型更改为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;

}

存储库类:

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代码的可执行Test类:

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());
    }

}

您不允许查询以对象类型“结尾”。 当查询选择包含对象列表的articles ,但是您必须从这些对象中至少选择一个字段。 您可以尝试

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

您可以尝试以下操作:

type Query {

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM