在 GraphQL-java 中为 GraphQL 枚举返回不同的值

Posted

技术标签:

【中文标题】在 GraphQL-java 中为 GraphQL 枚举返回不同的值【英文标题】:Return different value for GraphQL enum in GraphQL-java 【发布时间】:2020-06-10 22:07:54 【问题描述】:

我在应用程序中有以下枚举。

public enum State 
    Started("newly started"),
    Hold("hold on"),
    Running("still running"),
    Stop("just stopped");

    private String value;

    State(String value) 
        this.value = value;
    

    public String getValue() 
        return value;
    

我也有同样的 GraphQL 架构。我使用的是 GraphQL-java 库而不是 GraphQL-spqr 或 GraphQL-java-tools。当我返回这个枚举时,它的名称被返回,但我想返回它的分配值,即“仍在运行”用于运行枚举,“刚刚停止”用于停止枚举等。GraphQL-java 中有什么方法吗?

提前致谢

【问题讨论】:

【参考方案1】:

它的名字被返回,但我想返回它的赋值

这是设计使然。来自spec:

枚举不是对数值的引用,而是其自身的唯一值。它们可以序列化为字符串:表示值的名称。

枚举值被序列化为其名称。您可以提供一个附加值,在执行期间可以在内部使用,但该值不会在响应中使用。

【讨论】:

这正是我想要的。那么,你有没有这样的方法可以实现呢?我可以使用一些指令或任何其他方式来做到这一点吗?一个例子将不胜感激。 我不确定您到底想在这里做什么,但如果您需要 running 而不是 Running 作为名称,那么只需使用 running 作为名称。 我刚刚更新了我的问题。我想将值(“新开始”,“坚持”..)返回给客户端,因为我有空格分隔的字符串,我无法保持它在 Enum 中的样子。 不幸的是,这是不可能的。您必须在名称中使用下划线而不是空格并将它们转换为客户端。 GraphQL 规范与 Java 枚举或它们的序列化方式无关。你可以用你想要的模式中的任何值来表示你的 GraphQL 枚举,并且由你来提供 GraphQL 和 java 之间的映射,例如通过graphql.schema.idl.EnumValuesProvider。也就是说,GraphQL 不允许您在枚举值名称中使用空格。【参考方案2】:

您可以根据需要通过提供自定义映射将 GraphQL 枚举映射到 Java 枚举。 但是 GraphQL 不允许你的枚举值有空格。因此,您可以使用不带空格的枚举,也可以将状态字段声明为字符串。

或者您可以提供这些字符串作为枚举值的描述​​。

GraphQLEnumType.newEnum()
    .name("State")
    .value("Started", State.Started, "newly started")
    // ...
    .build();

或通过 SDL:

enum State 
    "newly started"
    Started

可以通过以下方式查询这些描述:

query 
  __type(name: "State") 
    enumValues 
      name
      description
    
  

【讨论】:

以上是关于在 GraphQL-java 中为 GraphQL 枚举返回不同的值的主要内容,如果未能解决你的问题,请参考以下文章

graphql-java:如何在以编程方式生成 graphql 模式时添加自定义标量类型?

使用 graphql-java 构建 Relay GraphQL 服务器

在 graphql-java 中注册自定义标量

Spring boot graphql-java 和订阅

从 GraphQL-Java 返回错误

graphql-java 循环类型依赖