[英]GraphQL and Java
我是GraphQL的新手。 我正在尝试使用graphql-java在Java中为非常简单的架构实现服务器端代码。 但是,我收到“警告:查询未能通过验证:'{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;
}
存储库类:
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.