GraphQL-Java二次开发
Directive
Directive,指令,可以对Field\Type等类型进行标识,进行一些特殊功能,下面介绍几个常用的指令
计算指令 calc
通过calc指令,可以在服务端,实行对一些字段的自定义处理.其底层是利用解析Groovy脚本实现
directive @calc ( pattern: String! ) on FIELD_DEFINITION | FIELD
#学生信息
type Student {
id: ID
name: String @calc(pattern : "${这个人的名字是name}")
}
返回结果
"Student":
{
"name": "这个人的名字是Jack"
}
源码实现
public GraphQLFieldDefinition onField(SchemaDirectiveWiringEnvironment<GraphQLFieldDefinition> env) {
GraphQLFieldDefinition field = env.getElement();
GraphQLFieldsContainer parentType = env.getFieldsContainer();
String groovyString = (String) env.getDirective().getArgument("pattern").getValue();
DataFetcher originalFetcher = env.getCodeRegistry().getDataFetcher(parentType, field);
DataFetcher dataFetcher = DataFetcherFactories
.wrapDataFetcher(originalFetcher, ((dataFetchingEnvironment, value) -> {
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(dataFetchingEnvironment.getSource()));
Map<String, Object> map = jsonObject.getInnerMap();
return GroovyUtil.calculate(groovyString, map);
}));
env.getCodeRegistry().dataFetcher(parentType, field, dataFetcher);
return field;
}