自定义指令的非原始类型属性

时间:2019-10-14 14:29:54

标签: graphql graphql-java

我对graphql模式定义有疑问。

可以将非基本类型定义为指令的属性吗?如果是,那么在字段上使用指令时的语法是什么?

例如,假设存在一个Url类型,定义如下:

type Url {
   address: String!
   desription: String
}

和指令

@custom_directive { 
    url: Url!
} on FIELD_DEFINITION

然后如何在字段上使用该指令?

type AnotherType {
    field: SomeOtherType @custom_directive(url: ???)
}

Thx

1 个答案:

答案 0 :(得分:0)

是的。您可以在指令中将非标量类型定义为属性,但它应为Input类型:

input UrlInput {
   address: String!
   desription: String
}

在声明时,您还会错过directive保留字。应该是:

directive @custom_directive (url:UrlInput!) on FIELD_DEFINITION

要在字段上注释:

type AnotherType {
    field: SomeOtherType @custom_directive (url : {address: "foo" description: "bar"})
}

给出GraphQLSchema,然后可以通过以下方式访问在给定字段上注释的指令值:

    Map<String, Object> value  = (Map<String, Object>) graphQLSchema
       .getObjectType("AnotherType")
       .getFieldDefinition("field")
       .getDirective("custom_directive")
       .getArgument("url").getValue();

    value.get("address") //foo 
    value.get("description") //bar

您还可以实现SchemaDirectiveWiring并覆盖其onField(),该名称将被为此指令标记的字段调用 在构建GraphQLSchema期间。在此方法中,您可以根据该指令中配置的值来更改该字段的GraphQLFieldDefinition。 (例如,修改其数据提取器等)

SchemaDirectiveWiring在构建RuntimeWiring时由以下人员注册:

RuntimeWiring.newRuntimeWiring()
.directive("custom_directive", new MySchemaDirectiveWiring())
.build();