如何公开具有不同名称的graphql字段

如何公开具有不同名称的graphql字段,graphql,graphql-java,Graphql,Graphql Java,我正在探索GraphQL,想知道是否有任何方法可以重命名响应字段,例如,我有一个带有这些字段的POJO class POJO { Long id; String name; } GraphQL查询: type POJO { id: Long name: String } 我的回答是这样的 { "POJO" { "id": 123, "name": "abc" } } 我是否可以将名称字段重命名为类似用户名的名称,以便我的回答如下 { "POJO"

我正在探索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"
  }
}
您可以使用修改JSON响应中的各个键

如果这是您的原始查询

query {
  POJO {
    id
    name
  }
}
您可以为字段
name
引入GraphQL别名
userName
,如下所示:

query {
  POJO {
    id
    userName: name
  }
}
您还可以在同一GraphQL操作中使用GraphQL别名。使用字段参数时,此get特别有趣:

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

  second: POJO(first: 1, skip: 1) {
    id
    name
  }
}
public String field(@GraphQLName("val") String value) {
  return value;
}

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

示例来自: 此外,@GraphQLName可用于重写字段名。您可以使用@GraphQLDescription设置描述

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

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

  second: POJO(first: 1, skip: 1) {
    id
    name
  }
}
public String field(@GraphQLName("val") String value) {
  return value;
}

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

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


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

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

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");
    }

}
公共类ProductReviewType:ObjectGraphType
{
公共产品评论类型()
{
字段(x=>x.ProductReviewId,类型:typeof(IdGraphType)).Description(“此处的一些描述”);
字段(x=>x.ProductId).Description(“此处有一些描述”);
字段(“reviewername”,x=>x.reviewername).Description(“此处的一些描述”);
字段(“reviewdate”,x=>x.reviewdate)。描述(“此处的一些描述”);
字段(“emailaddress”,x=>x.emailaddress).Description(“此处的一些描述”);
字段(“评级”,x=>x.rating)。描述(“此处的一些描述”);
字段(“注释”,x=>x.comments).Description(“此处的一些描述”);
字段(“modifieddate”,x=>x.modifieddate).Description(“此处的一些描述”);
}
}

在上面的代码中,modifieddate将是属性“modifieddate”的字段名。

我不想更改我的查询,我在想,如果我可以在从后端返回结果之前将该字段映射到不同的名称,这可能吗?为什么不直接在模式中重命名该字段呢?我认为这是由客户端控制的。但如果暴露字段需要服务器端进行转换怎么办?这基本上是@AmitKumar问的同一个问题,我的答案也是一样的。这就解决了我在客户端使用自定义字段名的问题。谢谢执行此操作的传统方法是在(自定义)解析器中。因此,查询中的参数值将是
userName
,您可以在解析器中查找
name
值。如果您所能修改的只是一个现有的模式,这甚至可以工作。请参阅Apollo文档中的。请注意,这种重命名策略似乎不适用于InputObjectGraphType(用于突变的类型)。