在 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 模式时添加自定义标量类型?