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]
}
我是 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]
}