如何使用不同的名称公开graphql字段

时间:2017-12-19 08:48:12

标签: graphql graphql-java

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

class POJO {
  Long id;
  String name;
}

GraphQL查询:

type POJO {
  id: Long
  name: String
}

我的回答是这样的

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

我可以将name字段重命名为userName,以便我的响应低于

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

4 个答案:

答案 0 :(得分:20)

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

如果这是您的原始查询

query {
  POJO {
    id
    name
  }
}

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

query {
  POJO {
    id
    userName: name
  }
}

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

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

如果您正在使用工具从Java类型(graphql-java-annotationsgraphql-spqr等)生成模式,那么使用该工具的工具来驱动映射。上述两个工具都允许通过注释自定义映射。 GraphQL-SPQR也可以通过外部配置实现相同的功能。

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

答案 3 :(得分:0)

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

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