nobody是什么意思graphqljava中⽂⽂档_GraphQL系列四Java实战⼊门
添加依赖
gradle
compile 'aphql-java:graphql-java:3.0.0'
maven
graphql-java
3.0.0
本⽂⽰例使⽤的构建⼯具是Gradle。
⽰例代码结构
⽰例结构⽬录如下
├── advance ⾼级⽰例
│ ├── GraphQL_argument.java 传⼊参数⽰例
│ ├── GraphQL_interface.java 接⼝⽰例
│ └── GraphQL_union.java 联合⽰例
peach怎么读├── get_start ⼊门⽰例
│ └── GraphQL_Simple.java 简单⼊门⽰例
└── model Java实体
├── Dog4Interface.java 为接⼝⽰例准备的Dog实现
├── Dog4Union.java 为联合⽰例准备的Dog
├── Fish4Interface.java 为接⼝⽰例准备的Fish实现
├── Fish4Union.java 为联合⽰例准备的Fish
├── IAnimal.java 为接⼝⽰例准备的Animal接⼝
└── Ur.java 为⽰例准备的Ur
每个⽰例基本遵循流程:提供带查询的⽰例数据-> 定义GrapQL数据类型 -> 定义暴露给客户端的query api和mutaion api -> 创建GraphQL Schema -> 测试输出。
简单⽰例
⽰例代码如下
// _start.GraphQL_Simple
//服务端⽰例数据
Ur ur=new Ur();
ur.tName("zhaiqianfeng");
ur.tSex("男");
polybutylene terephthalateur.tIntro("博主,专注于Linux,Java,nodeJs,Web前端:Html5,JavaScript,CSS3");
//定义GraphQL类型
GraphQLObjectType urType = newObject()
.name("Ur")
.field(newFieldDefinition().name("name").type(GraphQLString))
.field(newFieldDefinition().name("x").type(GraphQLString))
.field(newFieldDefinition().name("intro").type(GraphQLString))
.build();
//定义暴露给客户端的查询query api
GraphQLObjectType queryType = newObject()
.name("urQuery")
rolling in the deep歌词
.field(newFieldDefinition().type(urType).name("ur").staticValue(ur))
exceed.build();
//创建Schema
GraphQLSchema schema = wSchema()
.query(queryType)
.build();
//测试输出
GraphQL graphQL = wGraphQL(schema).build();
Map result = ute("{ur{name,x,intro}}").getData();
System.out.println(result);
执⾏输出
{ur={name=zhaiqianfeng, x=男, intro=博主,专注于Linux,Java,nodeJs,Web前端:Html5,JavaScript,CSS3}}参数(argument)⽰例
袁娅维crazy>怎么学俄语定义形参
传输参数是通过argument⽅法传⼊并指定类型,如
.argument(newArgument()
.name("id")
.type(new GraphQLNonNull(GraphQLInt)))
接收参数
获取参数使⽤DataFetchingEnvironment,如
int Argument("id");
获取参数有如下两个重构
Map getArguments();
T getArgument(String name);
但当我使⽤后者把传⼊的urInfo转换为Ur时,异常
java.util.LinkedHashMap cannot be cast to del.Ur 因此不得不如下蹩脚书写
Map Argument("urInfo");
Ur urInfo=new Ur();
for (String key : urInfoMap.keySet()){
switch (key){
ca "name":
urInfo.("name").toString());
break;
ca "x":
urInfo.("x").toString());
break;
ca "intro":
urInfo.("intro").toString());
break;
ca "skills":
管理学院排名
ArrayList skillsList=(ArrayList) ("skills");
String[] skills=new String[skillsList.size()];
urInfo.Array(skills));
break;
}
}
Resolver
解析数据使⽤的是DataFetcher,如
.dataFetcher(new DataFetcher() {
@Override
public Object get(DataFetchingEnvironment environment) {
int Argument("id");
(id);
}
}))
为了简洁,你可以使⽤lambda表达式
.dataFetcher(environment -> {
int Argument("id");
(id);
}))
联合(union)⽰例
这部分没说明好说的,如果了解了union的概念代码⽰例⾮常清晰,请参考github上的源码:GraphQL_union.java。使⽤GraphQLUnionType定义union类型,其中possibleType指定可以union的类型,重点是关注typeResolver来做类型转换,但个⼈觉得这⾥实现有待改进,对于Java这种强类型语⾔⾃动处理⽐较⼈性化。
GraphQLUnionType animalUnion = newUnionType()//定义联合类型(union)
.
name("IAnimal")
.possibleType(dogType)
.possibleType(fishType)
.description("动物联合")
.typeResolver(env -> {fabe
Object() instanceof Dog4Union){
return dogType;
}Object() instanceof Fish4Union){
return fishType;
}
return null;
})
.build();
接⼝(interface)⽰例
graphql-java对GraphQL的接⼝实现确实使⽤的Java接⼝,但个⼈觉得使⽤集成或许更合适。定义接⼝使⽤的GraphQLInterfaceType关键字,实现接⼝使⽤的withInterface关键字。
坑:对象为定义
上⾯的关键字都不难理解,蛋疼的是把如下的定义放在⽅法体中却提⽰为定义
GraphQLInterfaceType animalInterface = newInterface()//定义接⼝(interface)类型
.name("IAnimal")
.description("动物接⼝")
.field(newFieldDefinition()
.name("name")
.type(GraphQLString))
.typeResolver(new TypeResolver() {
@Override
public GraphQLObjectType getType(TypeResolutionEnvironment env) {英语b级
if (Object() instanceof Dog4Interface) {
return dogType; //提⽰ dogType 未定义
}
if (Object() instanceof Fish4Interface) {
return fishType; //提⽰ fishType 未定义
}
return null;
}
})
.build();
GraphQLObjectType dogType = newObject()//定义Dog类型
.name("Dog4Interface")
.field(newFieldDefinition().name("name").type(GraphQLString))
.field(newFieldDefinition().name("legs").type(GraphQLInt))
.withInterface(animalInterface)
.build();
GraphQLObjectType fishType = newObject()//定义Fish类型
.name("Fish4Interface")
.
field(newFieldDefinition().name("name").type(GraphQLString))
.field(newFieldDefinition().name("tailColor").type(GraphQLString))
.withInterface(animalInterface)
.build();
Schema加⼊额外类型
最后还要提⽰下,由于查询返回的接⼝,但实现并没有⾃动添加到Schema中,因此需要在创建Schema时间,将其⼿动加⼊//额外的GraphQL类型
Set types=new HashSet<>();
types.add(dogType);
types.add(fishType);
//创建Schema