【问题标题】:Return different value for GraphQL enum in GraphQL-java在 GraphQL-java 中为 GraphQL 枚举返回不同的值
【发布时间】: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 中有什么方法吗?

提前致谢

【问题讨论】:

    标签: java graphql 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
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 2021-07-12
      • 2017-03-31
      • 1970-01-01
      • 2019-10-19
      • 2018-10-24
      • 2018-12-22
      • 2018-04-08
      • 2019-01-07
      相关资源
      最近更新 更多