起源:www.toutiao.com/i6929867921162273292
前言
在浅尝GraphQL一文形容了GraphQL及根本应用,本文提供一个根本示例,形容如何基于spring boot的web我的项目疾速利用。
graphql-java的官网文档:Getting started with GraphQL Java and Spring Boot,提供了相干依赖用以疾速配置,然而集体真心不倡议应用这个库及相干配置形式来搭建脚手架,在理论开发中,业务比较复杂的时候,会导致须要配置的业务代码比拟多也比拟繁琐,绝对上面这种形式,代码复杂性比拟高。
本文提供一种更灵便快捷的形式,在spring boot我的项目中疾速利用开发。应用的依赖也和下面官网提供的都不一样,请留神辨别。
疾速开始
创立spring boot工程
通过Spring Initializr疾速搭建,我选的jdk版本及spring boot版本,如下所示,其它版本未做兼容性测试。
点击下方的Generate按钮:
关上工程构造如下,我将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类:
@Componentpublic 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
咱们须要裸露一个接口来接管申请,并作相干解决,也只需提供一个接口即可。因而咱们创立一个Controller:GraphqlController.
@RestController@RequestMapping("/graphql")@Logpublic 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(); }}
到这一步,其实基本功能都已配置实现,能够启动我的项目进行相干测试了。
整个我的项目的代码构造如下,我尽量用了一个比拟惯例的web我的项目构造(controller,service,dao等):
测试
示例中总共提供了3个接口,两个查问一个更新,别离进行测试:
ItemList queryItemList();Item queryById(Long id);Item updateName(Param param);
查问所有我的项目列表(只获取每个我的项目的编码和名称,以及列表总数):
依据ID查问,获取我的项目的id和名称
更新指定ID的项目名称
咱们我的项目Id为1编码为test的我的项目批改为“java我的项目”
再查问一下,能够看到后果更新了:
结束语
这样整个我的项目的GraphQL相干的根本配置曾经实现,能够进行业务开发了。
近期热文举荐:
1.1,000+ 道 Java面试题及答案整顿(2021最新版)
2.别在再满屏的 if/ else 了,试试策略模式,真香!!
3.卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!