источник:у-у-у-у. 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)», загрузите быстро!
Если вы считаете, что это хорошо, не забудьте поставить лайк + ретвитнуть!