java代码生成数据的schema,graphql-java使用手册: part2 创建Schema

本文详细介绍了如何使用graphql-java库通过Java代码和GraphQL SDL创建GraphQL Schema,强调了Schema的作用、DataFetcher和TypeResolver的重要性,并提供了示例代码。文章讨论了如何在大型Schema中进行模块化,并解释了如何处理递归类型和接口。此外,还提到了GraphQL Schema的模块化方法,包括合并多个SDL文件和使用type extensions进行扩展。
摘要由CSDN通过智能技术生成

创建Schema

Schema的主要用途是定义所有可供查询的字段(field),它们最终组合成一套完整的GraphQL

API.

“graphql-java”提供两种方法来定义Schema。用java代码来定义、用GraphQL

SDL(即IDL)来定义。

注意:SDL(IDL)现在还不是 官方 graphql 规范. 本GraphQL实现,是基于

已有的JS参考实现

来开发的。但JS参考实现中的很多代码也是基于SDL(IDL)语法的,所以你可以认为这语法是可以长期使用的.

如果你不确认用“java代码”还是用“GraphQL

SDL(即IDL)”来定义你的Schema,那么我们建议你用SDL(IDL)

SDL example:

type Foo {

bar: String

}

java代码例子:

GraphQLObjectType fooType = newObject()

.name("Foo")

.field(newFieldDefinition()

.name("bar")

.type(GraphQLString))

.build();

DataFetcher 与 TypeResolver

对象 DataFetcher

作用是获取字段(field)对应的数据;另外,在修改(mutation)操作时,可以更新数据

每个字段都有自己的 DataFetcher. 如果未为字段指定DataFetcher,

那么自动使用默认的 PropertyDataFetcher .

PropertyDataFetcher 从 Map 和 Java Beans 中获取数据.

所以,当Schema中的field名,与Map中的key值,或 Source Object 中的 java

bean 字段名相同时,不需要为field指定 DataFetcher.

对象 TypeResolver 帮助 graphql-java 判断数据的实际类型(type). 所以

Interface 和 Union 均需要指定关联的 TypeResolver(类型识别器) .

例如,你有一个 Interface 叫 MagicUserType

它有可能是以下的具体类型(Type) Wizard, Witch and Necromancer.

Type resolver(类型识别器) 的作用是在运行时识别出 GraphqlObjectType

的具体类型(Type)。后期具体类型下的field相关的 data

fetcher被调用并获取数据.

new TypeResolver() {

@Override

public GraphQLObjectType getType(TypeResolutionEnvironment env) {

Object javaObject = env.getObject();

if (javaObject instanceof Wizard) {

return (GraphQLObjectType) env.getSchema().getType("WizardType");

} else if (javaObject instanceof Witch) {

return (GraphQLObjectType) env.getSchema().getType("WitchType");

} else {

return (GraphQLObjectType) env.getSchema().getType("NecromancerType");

}

}

};

用 SDL 创建 Schema

当使用SDL方法来开发时,你需要同时编写对应的 DataFetcher 和

TypeResolver。

很大的 Schema IDL 文件很难查看。

schema {

query: QueryType

}

type QueryType {

hero(episode: Episode): Character

human(id : String) : Human

droid(id: ID!): Droid

}

enum Episode {

NEWHOPE

EMPIRE

JEDI

}

interface Character {

id: ID!

name: String!

friends: [Character]

appearsIn: [Episode]!

}

type Human implements Character {

id: ID!

name: String!

friends: [Character]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值