GraphQL с Java - Как разделить резолверы на несколько классов - PullRequest
0 голосов
/ 19 декабря 2018

Прежде всего я должен извиниться.Возможно, это глупый вопрос для начинающих, но постепенно я расстраиваюсь после того, как пролистал десятки уроков и вопросов ...

В чем проблема?У меня есть простая схема, похожая на следующую:

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

    }
}

Я могу запустить веб-приложение на моем сервере Jetty, но, поскольку я посещаю его из браузера, я получаю сообщения об ошибках, которые говорят мне, что функции allVehicles и allPersons не может быть найден.

(В других руководствах и проблемах у всех есть файлы .js, кроме их schema.graphqls, но я не понимаю, как они работают и зачем они нужны. В чем смысл?из 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 голосов
/ 10 июня 2019

Я использую сервер 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, как показано ниже:

@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 с несколькими классами распознавателя.Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...