Как открыть поле graphql с другим именем

Я изучаю GraphQL и хотел бы знать, есть ли способ переименовать поле ответа, например, у меня есть POJO с этим полем

class POJO {
  Long id;
  String name;
}

Запрос GraphQL:

type POJO {
  id: Long
  name: String
}

Мой ответ примерно такой

{
  "POJO" {
    "id": 123,
    "name": "abc"
  }
}

Могу ли я переименовать поле имени во что-то вроде userName, чтобы мой ответ был ниже

{
  "POJO" {
    "id": 123,
    "userName": "abc"
  }
}

person Amit Kumar    schedule 19.12.2017    source источник
comment
Традиционный способ сделать это - использовать (настраиваемый) преобразователь. Таким образом, значение аргумента в запросе будет userName, а в вашем преобразователе вы найдете значение name. Это сработало бы даже, если бы все, что вы могли изменить, было существующей схемой. См. Schema Delegation в документации Apollo.   -  person Benjamin R    schedule 25.06.2019


Ответы (4)


Вы можете использовать псевдонимы GraphQL для изменения отдельных ключей в ответе JSON.

Если это ваш исходный запрос

query {
  POJO {
    id
    name
  }
}

вы можете ввести псевдоним GraphQL userName для поля name следующим образом:

query {
  POJO {
    id
    userName: name
  }
}

Вы также можете использовать псевдонимы GraphQL для использования одно и то же поле запроса или мутации несколько раз в одной и той же операции GraphQL. Это особенно интересно при использовании параметров поля:

query {
  first: POJO(first: 1) {
    id
    name
  }

  second: POJO(first: 1, skip: 1) {
    id
    name
  }
}
person marktani    schedule 19.12.2017
comment
Я не хочу менять свой запрос, я подумал, могу ли я сопоставить это поле с другим именем, прежде чем возвращать результат из бэкэнда, возможно ли это? - person Amit Kumar; 20.12.2017
comment
Почему бы вам тогда просто не переименовать поле прямо в схеме? - person marktani; 20.12.2017
comment
Я думаю, что это контролируется клиентской стороной. Но что, если выставить поля, которые нужно преобразовать на стороне сервера? - person slideshowp2; 24.05.2019
comment
По сути, это тот же вопрос, который задал @AmitKumar, и мой ответ такой же. - person marktani; 24.05.2019
comment
Это устраняет мою проблему с именем настраиваемого поля на стороне клиента. Спасибо ! - person Meet Zaveri; 14.06.2021

Возникает вопрос: как вы вообще создаете схему? Между типами Java и GraphQL нет внутренней связи - они совершенно не связаны, если вы их не коррелируете. Таким образом, вы можете называть поля в схеме любым способом и создать преобразователь (DataFetcher), который будет получать значение откуда угодно (таким образом, любое поле POJO тоже).

Если вы используете инструмент для создания схемы из типов Java (graphql-java-annotations, graphql-spqr и т. д.), затем используйте возможности этого инструмента для управления отображением . Оба упомянутых инструмента позволяют настраивать отображение с помощью аннотаций. GraphQL-SPQR позволяет сделать то же самое и через внешнюю конфигурацию.

Если вы проясните свой вопрос дальше, я смогу дать более точный ответ.

person kaqqao    schedule 26.01.2018

Похоже, может помочь аннотация GraphQLName.

Пример из документации: «Кроме того, @GraphQLName можно использовать для переопределения имени поля. . Вы можете использовать @GraphQLDescription, чтобы задать описание. "

Их также можно использовать для параметров поля:

public String field(@GraphQLName("val") String value) {
  return value;
}
person Alex.Gri    schedule 25.12.2017

Я знаю, что этот вопрос очень старый, но для переименования поля используется следующий код:

public class ProductReviewType: ObjectGraphType<ProductReview>
{
    public ProductReviewType()
    {
        Field(x => x.ProductReviewId, type: typeof(IdGraphType)).Description("some desc here");
        Field(x => x.ProductId).Description("some desc here");
        Field("reviewername", x => x.ReviewerName).Description("some desc here");            
        Field("reviewdate",x => x.ReviewDate).Description("some desc here");
        Field("emailaddress", x => x.EmailAddress).Description("some desc here");
        Field("rating", x => x.Rating).Description("some desc here");
        Field("comments",x => x.Comments).Description("some desc here");
        Field("modifieddate", x => x.ModifiedDate).Description("some desc here");
    }

}

В приведенном выше коде modifieddate будет именем поля для свойства «ModifiedDate».

person Sormita Chakraborty    schedule 16.04.2020
comment
В качестве примечания, похоже, эта стратегия переименования не работает для InputObjectGraphType (типы, используемые при мутациях). - person K0D4; 06.08.2020