В этой статье вы узнаете, как использовать Spring for GraphQL в своем приложении Spring Boot.  Spring for GraphQL — относительно новый проект. Версия 1.0 была выпущена несколько месяцев назад. До этого релиза нам приходилось подключать сторонние библиотеки, чтобы упростить реализацию GraphQL в приложении Spring Boot. Я уже описал два альтернативных решения в своих предыдущих статьях. В следующей статье вы узнаете о проекте GraphQL Java Kickstart. В другой статье вы увидите, как создавать более сложные запросы GraphQL с помощью библиотеки Netflix DGS. Мы будем использовать очень похожую схему и модель сущностей, как и в этих двух статьях о Spring Boot и GraphQL. Если вы хотите попробовать сделать это самостоятельно, вы всегда можете посмотреть на мой исходный код. Для этого вам нужно клонировать мой  репозиторий GitHub. Затем просто следуйте моим инструкциям. Во-первых, вы должны перейти в каталог sample-app-spring-graphql. Наш пример на Spring Boot предоставляет API на базе GraphQL и подключается к базе данных H2 в памяти. Он использует Spring Data JPA в качестве слоя для взаимодействия с базой данных. Есть три сущности Employee, Department и Organization. Каждая из них хранится в отдельной таблице. Вот модель отношений. В дополнение к стандартным модулям Spring Boot нам необходимо включить следующие две зависимости: spring-graph-test предоставляет дополнительные возможности для построения модульных тестов. Стартер поставляется с необходимыми библиотеками и автоконфигурацией. Однако он не включает интерфейс GraphiQL. Чтобы включить его, мы должны установить следующее свойство в файле application.yml: По умолчанию Spring for GraphQL пытается загрузить файлы схемы из каталога src/main/resources/graphql. Он ищет там файлы с расширениями .graphqls или .gqls. Приведем схему GraphQL для сущности Department. Тип Department ссылается на два других типа: Organization и Employee (список сотрудников). Есть два запроса для поиска всех отделов и отдела по id и одна мутация для добавления нового отдела. Схема типа Organization очень похожа. Из более сложных вещей нам нужно обрабатывать соединения с типами Employee и Department. И последняя схема — для типа Employee. В отличие от предыдущих схем, она определяет тип, отвечающий за обработку фильтрации. EmployeeFilter может фильтровать по зарплате, должности или возрасту. Существует также метод запроса для обработки фильтрации — employeesWithFilter. Не держите на меня зла, но я использую Lombok при реализации сущностей. Вот сущность Employee, соответствующая типу Employee, определенному в схеме GraphQL. Здесь создается сущность Department. Наконец, мы можем взглянуть на сущность Organization. Spring for GraphQL предоставляет модель программирования на основе аннотаций, используя известный паттерн @Controller. Также можно адаптировать библиотеку Querydsl и использовать ее вместе со Spring Data JPA. Затем вы можете использовать ее в своих репозиториях Spring Data, аннотированных с помощью @GraphQLRepository. В этой статье я буду использовать стандартный JPA Criteria API для генерации более сложных запросов с фильтрами и объединениями. Начнем с нашего первого контроллера. По сравнению с обеими предыдущими статьями о Netflix DGS и GraphQL Java Kickstart, мы будем хранить запросы и мутации в одном классе. Нам нужно аннотировать методы запросов с помощью @QueryMapping, а методы мутации с помощью @MutationMapping. Последний метод запроса employeesWithFilter выполняет расширенную фильтрацию на основе динамического списка полей, переданных во входном типе  EmployeeFilter. Чтобы передать входной параметр, мы должны аннотировать аргумент метода с помощью @Argument. Вот наша реализация репозитория JPA. Чтобы использовать JPA Criteria API, нам необходимо, чтобы он расширял интерфейс JpaSpecificationExecutor. Это же правило применяется и к другим репозиториям: DepartmentRepository и OrganizationRepository. Теперь давайте переключимся на другой контроллер. Вот реализация контроллера DepartmentController. Здесь показан пример выборки отношений. Мы используем DataFetchingEnvironment, чтобы определить, содержит ли входной запрос поле отношения. В нашем случае это могут быть employees или organization. Если любое из этих полей определено, мы добавляем конкретное отношение в оператор JOIN. Тот же подход применяется к методам department и deparments.  Вот реализация контроллера OrganizationController. После того как мы создали всю логику, пришло время ее протестировать. В следующем разделе я покажу вам, как использовать для этого GraphiQL IDE.  Здесь мы сосредоточимся на модульных тестах. Самый простой способ начать тестировать Spring for GraphQL — использовать bean-компонент GraphQLTester. Мы можем использовать его в мок веб-среде. Вы также можете создавать тесты для уровня HTTP с помощью другого компонента — HttpGraphQlTester. Однако для этого требуется предоставить экземпляр WebTestClient. Вот тест для Employee @Controller. Каждый раз мы создаем встроенный запрос, используя нотацию GraphQL. Нам нужно аннотировать весь тестовый класс с помощью @AutoConfigureGraphQlTester. Затем мы можем использовать DSL API, предоставляемый GraphQLTester для получения и проверки данных из бэкенда. Помимо двух простых тестов, мы также проверяем, нормально ли работает EmployeeFilter в методе findWithFilter. Тесты для типа Deparment очень похожи. Кроме того, мы тестируем операторы соединения в тестовом методе findById, объявляя поле organization в запросе. Каждый раз, клонируя мой репозиторий, вы можете быть уверены, что примеры работают нормально благодаря автоматизированным тестам. Вы всегда можете проверить статус сборки репозитория в моем конвейере CircleCI. Мы можем легко запустить приложение с помощью следующей команды Maven: Как только вы это сделаете, вы сможете получить доступ к инструменту GraphiQL по адресу http://localhost:8080/graphiql. При запуске приложение вставляет некоторые демонстрационные данные в базу данных H2. GraphiQL предоставляет контекстную помощь при  построении запросов GraphQL. Вот пример запроса, протестированного там. Spring for GraphQL — очень интересный проект, и я буду внимательно следить за его развитием.  Помимо поддержки @Controller, я попытался использовать интеграцию querydsl с репозиториями Spring Data JPA. Однако у меня возникли некоторые проблемы с этим, и поэтому я не стал помещать эту тему в статью.  На данный момент Spring for GraphQL является третьим надежным Java-фреймворком с высокоуровневой поддержкой GraphQL для Spring Boot. Моим выбором по-прежнему остается Netflix DGS, но Spring for GraphQL находится в стадии активной разработки. Так что, вероятно, в скором времени мы можем ожидать новых и полезных функций.