Spring Boot + GraphQL 应用
点击关注公众号,Java干货及时送达 牛逼!又发现了一款面试题库,太全了!!
(点击查看)
在浅尝GraphQL一文描述了GraphQL及基本使用,本文提供一个基本示例,描述如何基于spring boot的web项目快速应用。
graphql-java的官方文档:Getting started with GraphQL Java and Spring Boot,提供了相关依赖用以快速配置,但是个人真心不建议使用这个库及相关配置方式来搭建脚手架,在实际开发中,业务比较复杂的时候,会导致需要配置的业务代码比较多也比较繁琐,相对下面这种方式,代码复杂性比较高。
快速开始
创建 Spring boot 工程
通过Spring Initializr快速搭建,我选的jdk版本及spring boot版本,如下所示,其它版本未做兼容性测试。

点击下方的Generate按钮:

打开工程结构如下,。 点击领取阿里P7面试视频 我将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.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实例
我们将创建一个GraphQL实例并将其注册到spring容器中,代码如下。Spring Boot 基础就不介绍了,推荐下这个实战教程: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()) //其它定义照上面的示例,继续增加
            .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")
@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();
    }
} 到这一步,其实基本功能都已配置完成,可以启动项目进行相关测试了。
整个项目的代码结构如下,我尽量用了一个比较常规的web项目结构(controller,service,dao等):
测试
示例中总共提供了3个接口,两个查询一个更新,分别进行测试:
ItemList queryItemList();
Item queryById(Long id);
Item updateName(Param param);查询所有项目列表(只获取每个项目的编码和名称,以及列表总数):

根据ID查询,获取项目的id和名称

更新指定ID的项目名称
我们项目Id为1编码为test的项目修改为“java项目”

再查询一下,可以看到结果更新了:

结束语
地址:https://blog.csdn.net/x763795151/article/details/117604505
如有文章对你有帮助,
欢迎关注❤️、点赞👍、转发📣!
推荐, Java面试题库,详情点击: 牛逼!又发现了一款牛逼的Java面试题库,史上最强! 



