GraphQL-Java二次开发

本文介绍GraphQL-Java中calc指令的使用,该指令允许在服务端对字段进行自定义处理,通过解析Groovy脚本实现。示例展示了如何对学生的姓名字段应用calc指令进行动态文本替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

graphql-java 是 GraphQLJava 实现。这个库的目标是用于真实的生产环境。graphql-java 解析和执行查询 GraphQL 。它并不真正获取任何数据的:数据来源于执行回调或提供静态数据。graphql-java 的 "hello world":import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLSchema; import static graphql.Scalars.GraphQLString; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLObjectType.newObject; public class HelloWorld {     public static void main(String[] args) {         GraphQLObjectType queryType = newObject()                         .name("helloWorldQuery")                         .field(newFieldDefinition()                                 .type(GraphQLString)                                 .name("hello")                                 .staticValue("world")                                 .build())                         .build();         GraphQLSchema schema = GraphQLSchema.newSchema()                         .query(queryType)                         .build();         Map result = new GraphQL(schema).execute("{hello}").getData();         System.out.println(result);         // Prints: {hello=world}     } } 标签:graphql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值