首先我要道歉。可能这是一个愚蠢的初学者问题,但是在翻阅了许多教程和问题后,我逐渐感到沮丧...
出了什么问题? 我有一个简单的架构,如下所示:
schema {
query: Query
}
type Query {
allVehicles: [Vehicle]!
allPersons: [Person]!
}
type Vehicle{
name: String!
}
Person{
name: String!
}
现在,我正在尝试让不同的类解决人和车辆的查询。因此,我为人建立了一个查询类,为车辆建立了一个查询类,都实现了 GraphQLQueryResolver 接口。
我有一个用于构建架构的类,它看起来像以下内容:
@WebServlet(urlPatterns = "/graphql")
public class GraphQLEndpoint extends SimpleGraphQLServlet {
public GraphQLEndpoint() {
super(buildSchema());
}
private static GraphQLSchema buildSchema() {
final VehicleRepository vehicleRepository = new VehicleRepository();
final PersonRepository personRepository = new PersonRepository();
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new VehicleQuery(vehicleRepository),
new PersonQuery(personRepository)),
.build()
.makeExecutableSchema();
}
}
我可以在码头服务器上启动Web应用程序,但是由于我是从浏览器访问Web应用程序的,因此出现错误,告诉我 allVehicles 和 allPersons 找不到。
(在其他教程和问题中,每个人的schema.graphqls旁边都有.js文件,但我既不明白它们的工作方式,又为什么它们是必需的。schema.graphqls的意义何在?让我委托哪个类来处理相应的查询。)
所以,请任何人告诉我,我在做什么错?
编辑:也许我应该向您展示查询类之一:
public class PersonQuery implements GraphQLRootResolver {
private final PersonRepository _personRepository;
public PersonQuery(
final PersonRepository pPersonRepository) {
this._personRepository = pPersonRepository;
}
public List<Person> allPersons() {
return _personRepository.getAllPersons();
}
}
答案 0 :(得分:0)
我使用 Spring Boot Graphql 服务器,并将GraphQLResolver
分成多个类,如下所示:
1)创建一个实现Query
的抽象GraphQLQueryResolver
类
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
public abstract class Query implements GraphQLQueryResolver {
}
2)通过扩展Query
创建单个查询解析器类。就我而言,我有两个类AuthorQuery
和BookQuery
:
BookQuery
类
import com.swissre.graphql.model.Book;
import com.swissre.graphql.repository.BookRepository;
public class BookQuery extends Query {
// private BookRepository bookRepository;
private BookRepository bookRepository;
public BookQuery(BookRepository bookRepository) {
super();
this.bookRepository = bookRepository;
}
public Iterable<Book> findAllBooks() {
return bookRepository.findAll();
}
AuthorQuery
类
import com.swissre.graphql.model.Author;
import com.swissre.graphql.repository.AuthorRepository;
public class AuthorQuery extends Query {
private AuthorRepository authorRepository;
public AuthorQuery(AuthorRepository authorRepository) {
super();
this.authorRepository = authorRepository;
}
public Iterable<Author> findAllAuthors() {
return authorRepository.findAll();
}
并且您需要提供这些解析程序类作为Graphql构建模式的一部分。就我而言,我使用Spring Boot Graphql服务器,如果您不更改Graphql端点,那么它不需要任何额外的配置。我要做的就是在主Spring配置文件中提供这些Bean,如下所示:
@SpringBootApplication
public class DemoGraphQLApplication {
public static void main(String[] args) {
SpringApplication.run(DemoGraphQLApplication.class, args);
}
@Bean
public BookResolver bookResolver(AuthorRepository authorRepository) {
return new BookResolver(authorRepository);
}
@Bean
public AuthorResolver authorResolver(BookRepository bookRepository) {
return new AuthorResolver(bookRepository);
}
通过此设置,我能够成功运行具有多个解析器类的Graphql服务器。 希望这会有所帮助!