簡體   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