GraphQL и Java - PullRequest
       13

GraphQL и Java

0 голосов
/ 06 декабря 2018

Я новичок в GraphQL.Я пытаюсь реализовать серверный код для очень простой схемы в Java, используя graphql-java.Тем не менее, я получаю «ПРЕДУПРЕЖДЕНИЕ: запрос не удалось проверить:« {статьи} »» и NullPointerException (что имеет смысл).Как мне получить результаты моего простого запроса?Что я делаю неправильно?Интересно то, что когда я изменяю тип articles в моем Query на String (как показано ниже), он работает!

type Query {
    articles: String
}

Вот моя фактическая схема:

schema {
    query: Query
}

type Query {
    articles: [Article]
}

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

Вот мой Java-бин (я использовал аннотации 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);
    }

}

Исполняемый класс Test, содержащий код GraphQL:

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

}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете попробовать следующее:

type Query {

  articles(id: Int!, title: String, text: String): [Article]
}
0 голосов
/ 06 декабря 2018

Вам не разрешено иметь запрос, который "заканчивается" в типе объекта.Когда ваш запрос выбирает articles, это список объектов, но вы должны выбрать хотя бы одно поле из этих объектов.Вы можете попробовать вместо

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