Spring?Boot? ?GraphQL?才是?API?的未來!
在淺嘗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ù)雜性比較高。本文提供一種更靈活快捷的方式,在spring boot項目中快速應(yīng)用開發(fā)。使用的依賴也和上面官方提供的都不一樣,請注意區(qū)分。
快速開始
創(chuàng)建spring boot工程
通過Spring Initializr快速搭建,我選的jdk版本及spring boot版本,如下所示,其它版本未做兼容性測試。點擊下方的Generate按鈕:打開工程結(jié)構(gòu)如下,我將application.properties刪除了替換成applicaiton.yml,因為我個人比較喜歡yaml的配置方式:引入相關(guān)依賴
pom.xml配置如下:"1.0"?encoding="UTF-8"?>"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">
?
?
??
??spring-boot-starter-parent
??
??
?
?
?graphql.demo
?
?
?
?
??
??
??
??UTF-8
??UTF-8
??
??
??
?
?
??
???
???spring-boot-starter
??
??
???
???spring-boot-starter-web
??
??
???
???spring-boot-starter-test
???
??
??
???
???lombok
???
???
??
??
???
???graphql-java-tools
???
??
??
???
???gson
???
??
?
?
??
???
????
????spring-boot-maven-plugin
???
??
?
初始化GraphQL實例
我們將創(chuàng)建一個GraphQL實例并將其注冊到spring容器中,代碼如下。Spring Boot 基礎(chǔ)就不介紹了,推薦下這個實戰(zhàn)教程:https://www.javastack.cn/categories/Spring-Boot/創(chuàng)建一個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())??//其它定義照上面的示例,繼續(xù)增加
????????????.build().makeExecutableSchema();
????????this.graphQL?=?graphQL.newGraphQL(graphQLSchema).build();
????}
}
關(guān)于*.graphqls
或者對應(yīng)的Resolver如ItemResolver,可以參看淺嘗GraphQL相關(guān)描述,這里只是作了微調(diào)整,相關(guān)代碼如下:base.grqphqlsschema?{????#?查詢
????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!
}
ItemResolverpublic?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ù)代碼比較多,就不一一貼了。