Spring Boot + GraphQL 應(yīng)用
點擊關(guān)注公眾號,Java干貨及時送達(dá) 牛逼!又發(fā)現(xiàn)了一款面試題庫,太全了??!
(點擊查看)
在淺嘗GraphQL一文描述了GraphQL及基本使用,本文提供一個基本示例,描述如何基于spring boot的web項目快速應(yīng)用。
graphql-java的官方文檔:Getting started with GraphQL Java and Spring Boot,提供了相關(guān)依賴用以快速配置,但是個人真心不建議使用這個庫及相關(guān)配置方式來搭建腳手架,在實際開發(fā)中,業(yè)務(wù)比較復(fù)雜的時候,會導(dǎo)致需要配置的業(yè)務(wù)代碼比較多也比較繁瑣,相對下面這種方式,代碼復(fù)雜性比較高。
快速開始
創(chuàng)建 Spring boot 工程
通過Spring Initializr快速搭建,我選的jdk版本及spring boot版本,如下所示,其它版本未做兼容性測試。

點擊下方的Generate按鈕:

打開工程結(jié)構(gòu)如下,。?點擊領(lǐng)取阿里P7面試視頻 我將application.properties刪除了替換成applicaiton.yml,因為我個人比較喜歡yaml的配置方式:

引入相關(guān)依賴
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.0modelVersion>
?<parent>
??<groupId>org.springframework.bootgroupId>
??<artifactId>spring-boot-starter-parentartifactId>
??<version>2.4.6version>
??<relativePath/>?
?parent>
?<groupId>com.xuxdgroupId>
?<artifactId>graphql.demoartifactId>
?<version>0.0.1-SNAPSHOTversion>
?<name>graphql.demoname>
?<description>GraphQL Demo project for Spring Bootdescription>
?<properties>
??<java.version>1.8java.version>
??<maven.compiler.source>1.8maven.compiler.source>
??<maven.compiler.target>1.8maven.compiler.target>
??<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
??<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
??<lombok.version>1.18.20lombok.version>
??<graphql-java-tools.version>11.0.1graphql-java-tools.version>
??<gson.version>2.8.7gson.version>
?properties>
?<dependencies>
??<dependency>
???<groupId>org.springframework.bootgroupId>
???<artifactId>spring-boot-starterartifactId>
??dependency>
??<dependency>
???<groupId>org.springframework.bootgroupId>
???<artifactId>spring-boot-starter-webartifactId>
??dependency>
??<dependency>
???<groupId>org.springframework.bootgroupId>
???<artifactId>spring-boot-starter-testartifactId>
???<scope>testscope>
??dependency>
??<dependency>
???<groupId>org.projectlombokgroupId>
???<artifactId>lombokartifactId>
???<version>${lombok.version}version>
???<scope>providedscope>
??dependency>
??<dependency>
???<groupId>com.graphql-java-kickstartgroupId>
???<artifactId>graphql-java-toolsartifactId>
???<version>${graphql-java-tools.version}version>
??dependency>
??<dependency>
???<groupId>com.google.code.gsongroupId>
???<artifactId>gsonartifactId>
???<version>${gson.version}version>
??dependency>
?dependencies>
?<build>
??<plugins>
???<plugin>
????<groupId>org.springframework.bootgroupId>
????<artifactId>spring-boot-maven-pluginartifactId>
???plugin>
??plugins>
?build>
project>初始化GraphQL實例
我們將創(chuàng)建一個GraphQL實例并將其注冊到spring容器中,代碼如下。Spring Boot 基礎(chǔ)就不介紹了,推薦下這個實戰(zhàn)教程:https://www.javastack.cn/categories/Spring-Boot/
@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()) //其它定義照上面的示例,繼續(xù)增加
????????????.build().makeExecutableSchema();
????????this.graphQL = graphQL.newGraphQL(graphQLSchema).build();
????}
}關(guān)于*.graphqls或者對應(yīng)的Resolver如ItemResolver,可以參看淺嘗GraphQL相關(guān)描述,這里只是作了微調(diào)整,相關(guān)代碼如下:
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! # 獲取項目總數(shù)
}
input?Param?{
????id: ID!
????name: String!
}ItemResolver
public?class?ItemResolver?implements?GraphQLQueryResolver, GraphQLMutationResolver?{
????private?IItemService itemService;
????public?ItemResolver(IItemService itemService)?{
????????this.itemService = itemService;
????}
????// 對應(yīng)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);
????}
}相關(guān)業(yè)務(wù)代碼比較多,就不一一貼了。
提供API
我們需要暴露一個接口來接收請求,并作相關(guān)處理,也只需提供一個接口即可。因此我們創(chuàng)建一個Controller: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 errors = executionResult.getErrors();
????????if?(errors != null?&& !errors.isEmpty()) {
????????????result.put("errors", errors);
????????????return?result;
????????}
????????return?executionResult.getData();
????}
} 到這一步,其實基本功能都已配置完成,可以啟動項目進(jìn)行相關(guān)測試了。
整個項目的代碼結(jié)構(gòu)如下,我盡量用了一個比較常規(guī)的web項目結(jié)構(gòu)(controller,service,dao等):
測試
示例中總共提供了3個接口,兩個查詢一個更新,分別進(jìn)行測試:
ItemList queryItemList();
Item queryById(Long id);
Item updateName(Param param);查詢所有項目列表(只獲取每個項目的編碼和名稱,以及列表總數(shù)):

根據(jù)ID查詢,獲取項目的id和名稱

更新指定ID的項目名稱
我們項目Id為1編碼為test的項目修改為“java項目”

再查詢一下,可以看到結(jié)果更新了:

結(jié)束語
地址:https://blog.csdn.net/x763795151/article/details/117604505
如有文章對你有幫助,
歡迎關(guān)注??、點贊??、轉(zhuǎn)發(fā)??!
推薦,?Java面試題庫,詳情點擊: 牛逼!又發(fā)現(xiàn)了一款牛逼的Java面試題庫,史上最強!



