Spring Boot + GraphQL — это будущее API!

Java задняя часть

источник:у-у-у-у. headline.com/i6929867921…

предисловие

GraphQL и его базовое использование описаны в статье Краткий вкус GraphQL, В этой статье представлен базовый пример, описывающий, как быстро применять веб-проекты на основе весенней загрузки.

Официальный документ graphql-java: Начало работы с GraphQL Java и Spring Boot содержит соответствующие зависимости для быстрой настройки, но лично я очень не рекомендую использовать эту библиотеку и связанные с ней методы настройки для построения скаффолдинга. сложный Иногда это приводит к большему количеству бизнес-кодов, которые необходимо настроить, и к более сложному По сравнению со следующим методом сложность кода относительно высока.

В этой статье представлен более гибкий и быстрый способ быстрого применения разработки в проектах Spring Boot. Используемые зависимости также отличаются от официально предоставленных выше, обратите внимание на различие.

быстрый старт

Создать весенний загрузочный проект

Быстрая сборка через Spring Initializr, я выбрал версию jdk и версию spring boot, как показано ниже, другие версии не проверялись на совместимость.

Нажмите кнопку «Создать» ниже:

Структура открытого проекта следующая, я удалил application.properties и заменил его на applicaiton.yml, т.к. лично я предпочитаю метод настройки yaml:

Импорт связанных зависимостей

pom.xml настроен следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.4.6</version>
  <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.xuxd</groupId>
 <artifactId>graphql.demo</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>graphql.demo</name>
 <description>GraphQL Demo project for Spring Boot</description>
 <properties>
  <java.version>1.8</java.version>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <lombok.version>1.18.20</lombok.version>
  <graphql-java-tools.version>11.0.1</graphql-java-tools.version>
  <gson.version>2.8.7</gson.version>
 </properties>
 <dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
  </dependency>

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
  </dependency>

  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
  </dependency>

  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>${lombok.version}</version>
   <scope>provided</scope>
  </dependency>

  <dependency>
   <groupId>com.graphql-java-kickstart</groupId>
   <artifactId>graphql-java-tools</artifactId>
   <version>${graphql-java-tools.version}</version>
  </dependency>

  <dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
   <version>${gson.version}</version>
  </dependency>
 </dependencies>

 <build>
  <plugins>
   <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
  </plugins>
 </build>

</project>

Инициализировать экземпляр GraphQL

Мы создадим экземпляр GraphQL и зарегистрируем его в контейнере Spring с помощью следующего кода:

Создайте класс GraphQLProvider:

@Component
public class GraphQLProvider {

    private GraphQL graphQL;

    @Autowired
    private IItemService itemService;

    @Bean
    public GraphQL graphQL() {
        return graphQL;
    }

    @PostConstruct
    public void init() throws IOException {
        GraphQLSchema graphQLSchema = SchemaParser.newParser()
            .file("graphql/base.graphqls")
            .resolvers(new Query(), new Mutation())
            .file("graphql/item.graphqls")
            .resolvers(new ItemResolver(itemService))
//            .file("book.graphqls")
//            .resolvers(new BookResolver())  //其它定义照上面的示例,继续增加
            .build().makeExecutableSchema();

        this.graphQL = graphQL.newGraphQL(graphQLSchema).build();
    }

}

о*.graphqlsИли соответствующий Resolver, такой как ItemResolver, вы можете обратиться к описанию GraphQL, вот лишь небольшая корректировка, соответствующий код выглядит следующим образом:

base.grqphqls

schema {
    # 查询
    query: Query
    # 更新
    mutation: Mutation
}

type Query {
    version: String
}

type Mutation {
    version: String
}

item.graphqls

# 定义一个查询类型
extend type Query {
    queryItemList: ItemList  # 定义查询项目列表
    queryById(id: ID): Item
}

extend type Mutation {
    updateName(param: Param): Item
}

# 定义项目字段
type Item {
    id: ID!
    code: String!
    name: String!
}

type ItemList {
    itemList: [Item!]!  #获取项目列表
    total: Int!      # 获取项目总数
}

input Param {
    id: ID!
    name: String!
}

ItemResolver

public class ItemResolver implements GraphQLQueryResolver, GraphQLMutationResolver {

    private IItemService itemService;

    public ItemResolver(IItemService itemService) {
        this.itemService = itemService;
    }

    // 对应item.graphqls里的queryItemList
    public ItemList queryItemList() {
        return itemService.queryItemList();
    }

    public Item queryById(Long id) {
        return itemService.queryById(id);
    }

    public Item updateName(Param param) {
        return itemService.updateName(param);
    }
}

Есть много связанных бизнес-кодов, поэтому я не буду размещать их по одному.

Предоставить API

Нам нужно предоставить интерфейс для получения запросов и выполнения соответствующей обработки, и нам нужно только предоставить интерфейс. Итак, мы создаем контроллер: GraphqlController.

@RestController
@RequestMapping("/graphql")
@Log
public class GraphqlController {

    @Autowired
    private GraphQL graphQL;

    @PostMapping
    public Object execute(@RequestBody GraphqlRequest request) {
        ExecutionInput executionInput = ExecutionInput.newExecutionInput()
            .query(request.getQuery())
            .variables(request.getVariables())
            .build();
        Map<String, Object> result = new HashMap<>();

        ExecutionResult executionResult = graphQL.execute(executionInput);
        List<GraphQLError> errors = executionResult.getErrors();

        if (errors != null && !errors.isEmpty()) {
            result.put("errors", errors);
            return result;
        }
        return executionResult.getData();
    }
}

На данный момент, по сути, основные функции настроены, и можно запускать проект для сопутствующих тестов.

Структура кода всего проекта выглядит следующим образом, я стараюсь использовать более обычную структуру веб-проекта (контроллер, сервис, дао и т. д.):

контрольная работа

Всего в примере предусмотрено 3 интерфейса, два запроса и один update, которые тестируются отдельно:

ItemList queryItemList();

Item queryById(Long id);

Item updateName(Param param);

Запросите список всех элементов (просто получите код и имя каждого элемента, а также общее количество списков):

Запрос по идентификатору, чтобы получить идентификатор и имя проекта

Обновите имя проекта с указанным идентификатором

Идентификатор нашего проекта равен 1, а проект, закодированный как тест, изменен на «проект java».

Запросите еще раз, и вы увидите, что результаты обновлены:

заключительные замечания

Таким образом, базовая конфигурация, связанная с GraphQL всего проекта, завершена, и можно вести бизнес-развитие.

Рекомендуемые последние горячие статьи:

1.Более 1000 вопросов и ответов на собеседовании по Java (последняя версия 2021 г.)

2.Не используйте экран if/else, полный экранов, попробуйте режим стратегии, это вкусно! !

3.Какого черта! Каков новый синтаксис для xx ≠ null в Java?

4.Выпущен Spring Boot 2.5, и темный режим слишком жареный!

5.Последний выпуск «Руководства по разработке Java (издание Songshan)», загрузите быстро!

Если вы считаете, что это хорошо, не забудьте поставить лайк + ретвитнуть!