创建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]