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),它可以用于动态结构,比如Map
s。
通过以下方式注册:
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("typeName"))
使用自定义标量。请注意,在第二个和第三个示例中,Scalars
是 io.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 模式时添加自定义标量类型?