Да. Вы можете определить нескалярный тип как атрибут в директиве, но это должен быть тип 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();