Spring GraphQL初体验

简介: `GraphQL`是一个用于API的查询语言,通过`GraphQL`可以实现按需获取数据。最近Spring发布了`Spring GraphQL`项目,将GraphQL和Spring结合在一起,可以通过Spring Boot的方式使用`GraphQL`。

GraphQL是一个用于API的查询语言,通过GraphQL可以实现按需获取数据。最近Spring发布了Spring GraphQL项目,将GraphQL和Spring结合在一起,可以通过Spring Boot的方式使用GraphQL

引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>graphql-spring-boot-starter</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <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-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

编写yml配置文件

编写spring boot项目的配置文件,在配置文件中指定schema文件的位置

server:
  port: 8888
spring:
  graphql:
    schema:
      printer:
        enabled: true
    locations: /graphql  # 指定schema文件的位置, 默认在resources下的graphql文件夹下

编写schema

schema: 定义数据结构、类型和关系,在schema中定义的type和Java中的实体相对应

type: 对应Java中的实体对象

type Query: 定义查询,在查询时需要按照Query中的定义进行查询,不用映射成java对象,系统中必须存在

在resources/graphql目录下创建schema.graphqls文件,并写入如下内容:

# 定义查询
type Query {
    greeting: String
    author(id: ID!): Author
}

# 定义Author,和java中Author对象对应
type Author {
    id: ID!
    name: String!
    sex: SexEnum
    books: [Book]
}

# 定义Book,和java中Book对象对应
type Book {
    bookName: String!
    publish: Boolean!
    price: Float
}

# 定义枚举,和java中SexEnum对应
enum SexEnum {
    man,
    woman
}

编写实体类

实体类和schematype定义的属性一致

@Data
public class Author {

    private Integer id;

    private String name;

    private SexEnum sex;

    private List<Book> books;
}


@Data
public class Book {

    private String bookName;

    private boolean publish;

    private float price;
}

public enum SexEnum {

    man, woman;
}

编写查询

@Component
public class CustomizeRuntimeWiring implements RuntimeWiringBuilderCustomizer {

    @Override
    public void customize(RuntimeWiring.Builder builder) {
        
        builder.type("Query", typeWiring -> {
            
            // 查询greeting,返回hello
            typeWiring.dataFetcher("greeting", env -> "hello");

            // 查询作者 
            typeWiring.dataFetcher("author", env -> {

                Integer id = Integer.valueOf(env.getArgument("id"));

                Author author = new Author();
                author.setId(id);
                author.setName("小明");
                author.setSex(SexEnum.man);

                Book book1 = new Book();
                book1.setBookName("无敌拳法十三式");
                book1.setPublish(false);
                book1.setPrice(new SecureRandom().nextFloat());

                Book book2 = new Book();
                book2.setBookName("独孤十三剑");
                book2.setPublish(true);
                book2.setPrice(new SecureRandom().nextFloat());

                author.setBooks(Arrays.asList(book1, book2));

                return author;
            });

            return typeWiring;
        });
    }
}

启动项目查询

项目启动后访问 http://localhost:8888/graphiql 进入查询页面
在这里插入图片描述

查询

查询greeting
在这里插入图片描述

查询作者信息
在这里插入图片描述

查询作者和书籍
在这里插入图片描述

CSDN

相关文章
|
5月前
|
前端开发 Java API
Spring Boot与GraphQL的集成
Spring Boot与GraphQL的集成
|
5月前
|
Java API 开发者
如何在Spring Boot中使用GraphQL
如何在Spring Boot中使用GraphQL
|
4月前
|
Java Spring API
Spring框架与GraphQL的史诗级碰撞:颠覆传统,重塑API开发的未来传奇!
【8月更文挑战第31天】《Spring框架与GraphQL:构建现代API》介绍了如何结合Spring框架与GraphQL构建高效、灵活的API。首先通过引入`spring-boot-starter-data-graphql`等依赖支持GraphQL,然后定义查询和类型,利用`@GraphQLQuery`等注解实现具体功能。Spring的依赖注入和事务管理进一步增强了GraphQL服务的能力。示例展示了从查询到突变的具体实现,证明了Spring与GraphQL结合的强大潜力,适合现代API设计与开发。
149 0
|
5月前
|
前端开发 Java API
|
5月前
|
缓存 安全 Java
Spring Boot与GraphQL的集成最佳实践
Spring Boot与GraphQL的集成最佳实践
|
5月前
|
Java API Spring
教程:Spring Boot中如何集成GraphQL
教程:Spring Boot中如何集成GraphQL
|
5月前
|
Java API Spring
Spring Boot中使用GraphQL实现数据查询
Spring Boot中使用GraphQL实现数据查询
|
6月前
|
Java API Spring
Spring Boot中使用GraphQL实现数据查询
Spring Boot中使用GraphQL实现数据查询
|
6月前
|
Java API Spring
教程:Spring Boot中如何集成GraphQL
教程:Spring Boot中如何集成GraphQL
|
Java API 网络架构
Spring Boot - Rest VS GraphQL
Spring Boot - Rest VS GraphQL
60 0