首先,我必须道歉。可能这是一个愚蠢的初学者问题,但是在翻阅数十个教程和问题后,慢慢地我感到沮丧......
有什么问题?我有一个简单的架构,如下所示:
schema {
query: Query
}
type Query {
allVehicles: [Vehicle]!
allPersons: [Person]!
}
type Vehicle{
name: String!
}
Person{
name: String!
}
Run Code Online (Sandbox Code Playgroud)
现在我试图让不同的类解决人员和车辆的查询。因此,我为人员构建了一个查询类,为车辆构建了一个查询类,它们都实现了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();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在我的码头服务器上启动 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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 4
我使用Spring Boot Graphql服务器,并将其分为GraphQLResolver多个类,如下所示:
1)创建一个抽象Query类,实现GraphQLQueryResolver
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
public abstract class Query implements GraphQLQueryResolver {
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
班上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();
}
Run Code Online (Sandbox Code Playgroud)
您需要提供这些解析器类作为 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);
}
Run Code Online (Sandbox Code Playgroud)
通过此设置,我能够成功运行具有多个解析器类的 Graphql 服务器。希望这可以帮助!