【问题标题】:How to expose graphql field with different name如何公开具有不同名称的graphql字段
【发布时间】:2018-06-01 15:48:10
【问题描述】:

我正在探索 GraphQL,想知道是否有任何方法可以重命名响应字段,例如我有一个带有这些字段的 POJO

class POJO {
  Long id;
  String name;
}

GraphQL 查询:

type POJO {
  id: Long
  name: String
}

我的回答是这样的

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

我可以将名称字段重命名为类似用户名的名称,以便我的回复如下

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

【问题讨论】:

  • 执行此操作的传统方法是在(自定义)解析器中。所以查询中的参数值为userName,在解析器中查找name 值。如果您只能修改现有模式,这甚至会起作用。请参阅 Apollo 文档中的 Schema Delegation

标签: graphql graphql-java


【解决方案1】:

您可以使用GraphQL Aliases 修改 JSON 响应中的各个键。

如果这是您的原始查询

query {
  POJO {
    id
    name
  }
}

您可以为字段 name 引入 GraphQL 别名 userName,如下所示:

query {
  POJO {
    id
    userName: name
  }
}

您还可以使用 GraphQL 别名在同一 GraphQL 操作中使用 the same query or mutation field multiple times。这个 get 在使用字段参数时特别有趣:

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

  second: POJO(first: 1, skip: 1) {
    id
    name
  }
}

【讨论】:

  • 我不想更改我的查询,我在想是否可以在从后端返回结果之前将该字段映射到不同的名称,这可能吗?
  • 那你为什么不直接在模式中重命名字段呢?
  • 我认为这是由客户端控制的。但是如果暴露字段需要服务器端转换呢?
  • 这解决了我在客户端拥有自定义字段名称的问题。谢谢!
  • 很高兴这对于那些喜欢遵循单一命名约定的人来说存在。
【解决方案2】:

看起来 GraphQLName 注释可以提供帮助。

来自documentation 的示例: “另外,@GraphQLName 可用于覆盖字段名称。您可以使用@GraphQLDescription 设置描述。”

这些也可以用于字段参数:

public String field(@GraphQLName("val") String value) {
  return value;
}

【讨论】:

    【解决方案3】:

    问题是:您最初是如何创建架构的? Java 和 GraphQL 类型之间没有内在联系——除非你将它们关联起来,否则它们是完全不相关的。因此,您可以在架构中以任何您想要的方式命名字段,并创建一个解析器 (DataFetcher),从任何地方(因此任何 POJO 字段)获取值。

    如果您使用工具从 Java 类型(graphql-java-annotationsgraphql-spqr 等)生成架构,则使用该工具的工具来驱动映射。提到的两个工具都允许通过注释自定义映射。 GraphQL-SPQR 也可以通过外部配置实现同样的功能。

    如果您进一步澄清您的问题,我将能够给出更准确的答案。

    【讨论】:

      【解决方案4】:

      我知道这个问题很老,但以下代码用于重命名该字段:

      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”的字段名称。

      【讨论】:

      • 请注意,这种重命名策略似乎不适用于 InputObjectGraphType(用于突变的类型)。
      猜你喜欢
      • 2023-01-09
      • 2018-11-21
      • 2016-08-25
      • 2019-07-20
      • 2017-03-03
      • 2022-01-09
      • 2017-05-18
      • 2014-05-05
      • 2021-10-28
      相关资源
      最近更新 更多