带有Java的GraphQL-如何将解析器分成多个类

时间:2018-12-19 13:38:36

标签: java api graphql

首先我要道歉。可能这是一个愚蠢的初学者问题,但是在翻阅了许多教程和问题后,我逐渐感到沮丧...

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

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();
}

}

1 个答案:

答案 0 :(得分:0)

我使用 Spring Boot Graphql 服务器,并将GraphQLResolver分成多个类,如下所示:

1)创建一个实现Query的抽象GraphQLQueryResolver

 import com.coxautodev.graphql.tools.GraphQLQueryResolver;
   public abstract class Query implements GraphQLQueryResolver {
   }

2)通过扩展Query创建单个查询解析器类。就我而言,我有两个类AuthorQueryBookQuery

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服务器。 希望这会有所帮助!