3年前 (2021-10-16)  相关技术 |   抢沙发  1235 
文章评分 1 次,平均分 5.0

我尝试在Java+Spring Boot中实现它,我已经习惯了。

下面将描述HQL的实现等。

项目准备

开发环境

  • Windows10
  • Java 11(采用OpenJDK jdk11.0.4+11 OpenJ9 0.15.1)
  • Maven 3.5.4
  • STS 4.4.0

创建一个基本Spring Boot项目

使用Spring Boot实现GraphQL

添加GraphQL Java依赖项

使用graphql-java-kickstart / graphql-spring-boot。要执行的最小依赖项仅如下所示。

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>5.10.0</version>
</dependency>

还需要将kotlin的版本指定为属性(如果没有描述,则在运行时会发生异常)。

<properties>
    <java.version>11</java.version>
    <kotlin.version>1.3.10</kotlin.version>
</properties>

API第1部分:支持简单的get查询

考虑为以下模型获取ID的一个实体。

Member ( member ID , name, age)

GraphQL定义创建

src/main/resources/graphql创建一个描述类型定义和查询定义的文件,如下所示。

type Member {
    memberId: ID!
    name: String!
    age: Int
}

type Query {
    getMember(memberId:ID!): Member
}

Java端实现

实体类

首先,创建一个与类型定义匹配的实体类。

@Data
public class Member {
    private String memberId;
    private String name;
    private Integer age;
}

查询

接下来,创建与查询对应的方法。GraphQLQueryResolver创建一个实现类,并创建一个与查询名称同名的方法。定义一个也与参数和返回值相对应的类,并实现实际返回的实例。创建返回值的方法是任意的(使用MyBatis映射器(省略))。用所有值填写返回值字段​​可以作为Servlet返回。

@Component
public class MemberQueryResolver implements GraphQLQueryResolver {

    @Autowired
    MemberMapper mapper;

    public Member getMember(String memberId) {
        return mapper.getById(memberId);
    }
}

执行

启动配置

application.yml中描述Servlet的启动配置。

graphql:
  servlet:
    enabled: true
    mapping: /graphql
    corsEnabled: true

启动

写入后,将创建的项目作为Spring Boot App执行。

查询发布

http://localhost:8080/graphqlIf queryyou设置GraphQL查询作为URL参数的值并访问它,将获得结果。

例如,在发出以下查询时

query {
  getMember(memberId:"aaaaaaaa") {
    name
  }
}

除了新行和不必要的空白编码,然后查询%7BgetMember(memberId:%22aaaaaaaa%22)%7Bname%7D%7Dto以签入,因为curl。

$ curl -s "http://localhost:8080/graphql?query=query%7BgetMember(memberId:%22aaaaaaaa%22)%7Bname%7D%7D"
{"data":{"getMember":{"name":"齊藤京子"}}}

如果更改memberId并将年龄添加到采集密钥中,将得到以下结果。

$ curl -s "http://localhost:8080/graphql?query=query%7BgetMember(memberId:%22bbbbbbbb%22)%7Bname,age%7D%7D"
{"data":{"getMember":{"name":"佐々木久美","age":23}}}

引入Graph i QL

encodeuris由于使用curl或浏览器访问每个查询太麻烦,我们将引入一个工具来尝试查询。这次我们将使用图i QL。

添加依赖项

graph“i”将ql-spring-boot-starter程序添加到依赖项中。

<dependency>
    <groupId>com.graphql-java-kickstart</groupId>
    <artifactId>graphiql-spring-boot-starter</artifactId>
    <version>5.10.0</version>
</dependency>

execution

启动配置

application.yml中描述Servlet的启动配置。目前,如果您有以下设置,请启动它。

graphiql:
  enabled: true
  mapping: /graphiql
  endpoint:
    graphql: /graphql

启动

写入后,将创建的项目作为Spring Boot App执行。通道

当服务器启动时从浏览器启动http://localhost:8080/graphiql.

使用Spring Boot实现GraphQL

在左侧的查询创建屏幕上,字段名有一个输入帮助,执行结果的json也以格式化的形式显示。

API#2:尝试嵌套类型

除了第1部分中的模型之外,还可以考虑通过关系来获取一个实体的模型,该模型通过关系将以下多对多模型连接起来。

Member ( member ID , name, age)

Music ( song ID , song name)

Participating song relation ( song ID , member ID )

GraphQL定义修改

添加到定义文件中。由于它是多对多成员,因此它可以同时使用Musicis Musican Memberarray

type Member {
    memberId: ID!
    name: String!
    age: Int
    joining: [Music]
}

type Music {
    musicId: ID!
    title: String!
    members: [Member]
}

type Query {
    getMember(memberId:ID!): Member
    getMusic(musicId:ID!):Music
}

Java端实现

实体类

创建与新类型定义相对应的实体类。将属性定义为数组列表。

@Data
public class Music {
    private String musicId;
    private String title;
    private List<Member> members;
}

members现在已添加属性,请添加一个字段。

@Data
public class Member {
    private String memberId;
    private String name;
    private int age;
    private List<Music> joining;
}

查询

MemberQueryResolverIs保持不变。Member.joining创建在另一个类中插入值的逻辑。

DataClass(<>inside)中,GraphQlResolver创建一个指定插入目标实体类的实现类,并创建一个与插入目标字段同名的方法。在参数中指定插入目标的实体类,并返回要插入的实例。

MusicMapper.getMusicsOfMember是一种通过关系获取与memberId关联的所有音乐的方法(省略实现内容)

@Component
public class MemberResolver implements GraphQLResolver<Member> {

    @Autowired
    MusicMapper mapper;

    public List<Music> joining(Member member) {
        return mapper.getMusicsOfMember(member.getMemberId());
    }
}

execution

当您发出以下查询时

query {
  getMember(memberId:"cccccccc") {
    name, age, joining {
      title
    }
  }
}

将会返回下面的数据:

{
  "data": {
    "getMember": {
      "name": "富田鈴花",
      "age": 18,
      "joining": [
        {
          "title": "こんなに好きになっちゃっていいの?"
        },
        {
          "title": "ホントの時間"
        },
        {
          "title": "まさか 偶然…"
        },
        {
          "title": "川は流れる"
        }
      ]
    }
  }
}

在STS的调试模式下进行检查时,您可以看到搜索结果插入到字段中而非的实例作为MemberResolver.joining传递参数joining

此外,joining如果未在查询中指定,或者如果指定的memberId不存在且结果为null,则不会执行此方法。

API#3:尝试创建注册函数

到目前为止,我们只处理了查询(对应于CRUD中的R)。接下来,尝试实现变异(对应于CRUD C/U/D)。

添加了GraphQL定义

添加到定义文件中。

type Mutation {
    registerMusic(title: String!): Music
}

Java端实现

因为这里创建的是一个与现有实体相对应的实体。GraphQlmutationResolver创建一个实现类,并创建一个带有参数和返回值的方法​​与GraphQL类似的查询。

GenerateId()是一个生成成为ID的字符串的方法,MusicMapper.insert是一个插入所有参数信息的方法。(省略实现内容))

@Component
public class MusicMutationResolver implements GraphQLMutationResolver {

    @Autowired
    MusicMapper mapper;

    public Music registerMusic(String title) {
        Music music = new Music();
        music.setMusicId(generateId());
        music.setTitle(title);
        mapper.insert(music);
        return music;
    }
}

查询发布

如果发生突变,则使用后调用API。查询作为JSON格式参数附加。

*“在查询中转义

$ curl -s "http://localhost:8080/graphql" -X POST -H "Content-Type: application/json" -d '{"query":"mutation{registerMusic(title:\"NO WAR in the future\"){musicId,title}}"}'
{"data":{"registerMusic":{"musicId":"hogehoge","title":"NO WAR in the future"}}}

Graph i QL

在尝试使用Graph i QL时,在左侧mutation{…},并在其中写入API名称、参数和输出内容,就像在查询中一样。

使用Spring Boot实现GraphQL

原文地址:https://qiita.com/kurukuruz/items/b948e77a56b946864a86

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2447.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册