乐趣区

关于java:Spring-Boot-GraphQL-才是-API-的未来

起源: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 类:

@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<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 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版