GraphQL with Java - 如何将解析器分成多个类

Nig*_*ora 6 java api graphql

首先,我必须道歉。可能这是一个愚蠢的初学者问题,但是在翻阅数十个教程和问题后,慢慢地我感到沮丧......

有什么问题?我有一个简单的架构,如下所示:

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 应用程序,但由于我从浏览器访问它,我收到错误,告诉我无法找到函数allVehiclesallPersons

(在其他教程和问题中,每个人的 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 服务器。希望这可以帮助!