Не примитивный атрибут типа для пользовательской директивы - PullRequest
0 голосов
/ 14 октября 2019

У меня есть вопрос, касающийся определения схемы 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 голосов
/ 16 октября 2019

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