Graphql-java 中的自定义标量

Posted

技术标签:

【中文标题】Graphql-java 中的自定义标量【英文标题】:Custom Scalar in Graphql-java 【发布时间】:2018-02-12 13:24:53 【问题描述】:

我们计划在我们的应用程序中使用 Graphql 作为后端服务器。我们选择 Graphql-Java 来开发我们的 POC。我们遇到了创建自己的标量类型来处理 java.util.Map 对象类型的情况。

我们还没有找到任何有关创建自定义标量类型的文档。 在下面的示例代码中

RuntimeWiring buildRuntimeWiring() 
    return RuntimeWiring.newRuntimeWiring()
            .scalar(CustomScalar)

如何为 CustomScalar 对象完成实现。 需要帮助。

【问题讨论】:

【参考方案1】:

要大致了解如何制作标量,只需查看the existing ones 并执行类似操作。

graphql-java 还有一个用于额外标量的单独项目:graphql-java-extended-scalars。在那里你可以找到object scalar (a.k.a. JSON scalar),它可以用于动态结构,比如Maps。

通过以下方式注册:

RuntimeWiring.newRuntimeWiring().scalar(ExtendedScalars.Object)

【讨论】:

如何在我的代码中使用上述缩放器?我有一个 Spring-boot 应用程序,如果你能提供一个例子,它会有所帮助。 @Simple-Solution 您如何使用任何内置标量,如字符串或整数?没有区别。 不确定我理解你的意思。但是那些; String 和 Integer 是内置的,这一切都是自动发生的。所以上面的标量是对象,我需要为 Map 创建一个,对吗?你有例子吗。 name 参数的意义何在?那是我们在模式中定义的类型的名称吗? @Simple-Solution 自动发生?这是否意味着您正在使用 GraphQL-SPQR?如果是这样,请使用@GraphQLScalar 注释使用位置的类型(例如,注释方法参数)或使用不同的ScalarMappingStrategy(例如gen.withScalarMappingStrategy(new MapScalarStrategy()))。没有 SPQR,就没有自动映射。您设置每个字段的类型,例如newFieldDefinition().type(Scalars.GraphQLString),所以你可以改用newFieldDefinition().type(Scalars.graphQLObjectScalar("typeName"))。你会得到一个Map,就像任何对象输入一样,但具有动态结构。 @Simple-Solution 如果直接使用 schema-first 和 graphql-java,您可以通过 RuntimeWiring.newRuntimeWiring().scalar(Scalars.graphQLObjectScalar("typeN‌​ame")) 使用自定义标量。请注意,在第二个和第三个示例中,Scalarsio.leangen.graphql.util.Scalars 而不是 graphql.Scalars。或者只是将 SPQR 码复制到您自己的课程中。【参考方案2】:

在代码优先方法 (SPQR v0.9.6) 中添加 @GraphQLScalar 就足够了。 或者,作为替代方案,将标量定义添加到 GraphQLSchemaGenerator:

new GraphQLSchemaGenerator()
.withScalarMappingStrategy(new MyScalarStrategy())

并定义 MyScalarStrategy:

class MyScalarStrategy extends DefaultScalarStrategy 

@Override
public boolean supports(AnnotatedType type) 
  return super.supports(type) || GenericTypeReflector.isSuperType(MyScalarStrategy.class, type.getType());


【讨论】:

以上是关于Graphql-java 中的自定义标量的主要内容,如果未能解决你的问题,请参考以下文章

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

GraphQL使用之graphql-java自定义标量类型

SQL Server 中的自定义排序

keras 的指标返回啥值?标量还是张量?

使用graphql代码生成器时如何将自定义标量类型映射到打字稿类型?

graphql-java 中的 GraphQL 模式定义语言支持