我对graphql模式定义有疑问。
可以将非基本类型定义为指令的属性吗?如果是,那么在字段上使用指令时的语法是什么?
例如,假设存在一个Url类型,定义如下:
type Url {
address: String!
desription: String
}
和指令
@custom_directive {
url: Url!
} on FIELD_DEFINITION
然后如何在字段上使用该指令?
type AnotherType {
field: SomeOtherType @custom_directive(url: ???)
}
Thx
答案 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();